级联错误:被删除的对象会被级联重新保存



我有一个由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中完全删除。

相关内容

  • 没有找到相关文章

最新更新