Ошибка в Cascade: другой объект с таким же значением идентификатора уже был связан с сеансом

У меня есть проект по реализации NHibernate и с использованием отложенной загрузки. У меня есть два класса в этом проекте: Человек и Семья. Связь между этими двумя - это агрегация, это означает, что у человека есть список семьи. Картирование это:

  <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>

В этом проекте я получаю человека по идентификатору, а затем обновляю семью членов семьи.

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