Ошибка в каскаде: удаленный объект будет повторно сохранен каскадом - PullRequest
9 голосов
/ 31 октября 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")
        SessionInstance.Delete(fam);

Семья не удалена, поскольку выдается исключение по этому сообщению: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

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

1 Ответ

13 голосов
/ 31 октября 2011

В основном NHibernate жалуется на то, что вы явно указываете ему удалить запись для Семьи, а затем при повторном сохранении Человека семья будет возвращена на место, потому что у Человека по-прежнему есть ссылка наон в своем списке Семей.

Вместо этого NHibernate предлагает вам разобраться с этими отношениями объектно-ориентированным способом, который NHibernate позволяет вам использовать.Просто удалите ссылку на семью "Jaun" из списка Person.Families, а затем сохраните Person.Когда вы сделаете это, NHibernate удалит отношения между этой семьей и этим человеком.Если на семейство больше не ссылается что-либо еще, поскольку вы установили для свойства Cascade значение «all-delete-orphan», запись семейства «Jaun» будет полностью удалена из БД.

...