Грешка в каскадата: различен обект със същата стойност на идентификатора вече беше свързан със сесията

Имам проект чрез внедряване на NHibernate и използвам Lazy Loading. Имам два класа в този проект: Личност и Семейство. Връзката между тези две е агрегиране, което означава, че човек има списък със семейство. Картографирането е:

  <class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,Domain.Entities"/>
    </bag>

  </class>

В този проект получавам лице по ID, след което актуализирам семейство от семейства.

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        {
        fam.Code = 100;
        SessionInstance.Update(fam);
        }

Семейството не е актуализирано, защото хвърля изключение от това съобщение: `различен обект със същата стойност на идентификатора вече е свързан със сесията: 193, на обект: Domain.Entities.Family

Как мога да актуализирам семейство от хора?


person Ehsan    schedule 01.11.2011    source източник


Отговори (2)


Във вашия случай тук не е необходимо да се обаждате на Update. Просто трябва да изчистите сесията. Във вашия случай бих направил нещо подобно:

using (ITransaction transaction = SessionInstance.BeginTransaction())
{
    foreach (Family fam in person.Families)
    {
        if (fam.Name == "Jaun")
        {
            fam.Code = 100;
        }
    }

    transaction.Commit();
}

Или можете да направите нещо подобно:

foreach (Family fam in person.Families)
{
    if (fam.Name == "Jaun")
    {
        fam.Code = 100;
    }
}

SessionInstance.Flush();

ISession.Update() е предназначен за актуализиране на detached обекта. Във вашия случай обектът не е отделен. Трябва да прочетете следните 2 раздела в документацията на NHibernate, за да разберете по-добре това:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-insession
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-detached

person Cole W    schedule 01.11.2011

опитайте се да актуализирате обект лице вместо обект семейство.

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        {
        fam.Code = 100;
        }
SessionInstance.Update(person);
person Zohaib    schedule 01.11.2011
comment
Тествах вашето предложение, но не реших проблема си. все още хвърлят същото изключение. - person Ehsan; 01.11.2011
comment
Предполагам, че тогава трябва да се уверите, че същият обект на човек, който е със същия идентификатор, не трябва да бъде зареден другаде в сесията. @ehsanzeynali - person Zohaib; 01.11.2011
comment
Не съм сигурен какво означава това? Естествено човек, зареден в сесията, защото имам нужда от семейства на човек. Чрез тези части от код Person person = SessionInstance.Get<Person>(id); . - person Ehsan; 01.11.2011
comment
публикувайте пълен код, в рамките на началната и крайната точка на сесията. @ehsanzeynali - person Zohaib; 01.11.2011