我有一个NHibernate实现的项目并使用Lazy Loading。 我在这个项目中有两个班:人和家庭。 这两者之间的关系是聚合,是指Person有一个Person列表。 映射是:
<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]
如何删除一个人的家庭?
答案 0 :(得分:13)
基本上NHibernate所抱怨的是你明确告诉它删除一个家族的记录,然后当你重新保存Person时,Family将被放回原位,因为Person仍然有一个引用它在家庭列表中。
相反,NHibernate告诉你以NHibernate允许你使用的面向对象的方式来处理这种关系。只需从Person.Families列表中删除对“Jaun”系列的引用,然后保留Person。当你这样做时,NHibernate将删除该Family和该Person之间的关系。如果现在不再引用其他任何内容,因为您已将Cascade属性设置为“all-delete-orphan”,所以“Jaun”系列记录将从数据库中完全删除。