我有一个由NHibernate实现并使用延迟加载的项目。在这个项目中我有两个班:个人和家庭。这两者之间的关系是聚合,意思是一个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);
family not deleted, Because抛出异常:deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]
如何删除家庭成员?
基本上NHibernate抱怨的是你显式地告诉它删除Family的记录,然后当你重新保存Person时Family将被放回原处,因为Person在它的Family列表中仍然有对它的引用。
相反,NHibernate告诉你用NHibernate允许你使用的面向对象的方式来处理这个关系。只需从Person中删除对"Jaun"家族的引用。家庭列表,然后持久化Person。当你这样做的时候,NHibernate会删除那个Family和那个Person之间的关系。如果Family现在不再被其他任何东西引用,因为您已经将Cascade属性设置为"all-delete-orphan",那么"Jaun" Family记录将从DB中完全删除。