Ошибка в каскаде: другой объект с тем же значением идентификатора уже был связан с сеансом - PullRequest
1 голос
/ 01 ноября 2011

У меня есть проект, реализованный 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>

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

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

Как я могу обновить семью человека?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

В вашем случае здесь вам не нужно звонить 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

0 голосов
/ 01 ноября 2011

попытаться обновить объект person вместо объекта family.

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