9

我有一个 NHibernate 实现并使用延迟加载的项目。我在这个项目中有两个课程:Person 和 Family。这两者之间的关系是聚合,意味着一个人有一个人的列表。映射是:

  <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]

我怎样才能删除一个人的家庭?

4

1 回答 1

13

基本上 NHibernate 抱怨的是你明确告诉它删除家庭的记录,然后当你重新保存人时,家庭将被放回原处,因为人在它的家庭名单。

相反,NHibernate 告诉您以 NHibernate 允许您使用的面向对象的方式处理这种关系。只需从 Person.Families 列表中删除对“Jaun”系列的引用,然后持久保存 Person。当你这样做时,NHibernate 将删除那个家庭和那个人之间的关系。如果家庭现在不再被其他任何东西引用,因为您已将级联属性设置为“all-delete-orphan”,“Jaun”家庭记录将从数据库中完全删除。

于 2011-10-31T14:28:07.510 回答