Ошибка в каскаде: удаленный объект будет повторно сохранен каскадом
У меня есть проект по реализации 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")
SessionInstance.Delete(fam);
Семья не удалена, поскольку выдается исключение по этому сообщению: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]
Как я могу удалить семью человека?
1 ответ
В основном, на что жалуется NHibernate, так это то, что вы явно говорите ему об удалении записи для Семьи, а затем при повторном сохранении Человека семья будет возвращена на место, потому что у Человека по-прежнему есть ссылка на него. список семей.
Вместо этого NHibernate предлагает вам разобраться с этими отношениями объектно-ориентированным способом, который NHibernate позволяет вам использовать. Просто удалите ссылку на семью "Jaun" из списка Person.Families, а затем сохраните Person. Когда вы сделаете это, NHibernate удалит отношения между этой семьей и этим человеком. Если на семейство больше не ссылается что-либо еще, поскольку вы установили для свойства Cascade значение "all-delete-orphan", запись семейства "Jaun" будет полностью удалена из БД.