级联错误:已删除的对象将通过级联重新保存

Ehs*_*san 9 c# nhibernate cascade nhibernate-mapping nhibernate-cascade

我有一个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>
Run Code Online (Sandbox Code Playgroud)

在这个项目中,我通过ID获取一个人然后删除一个家庭的人.

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        SessionInstance.Delete(fam);
Run Code Online (Sandbox Code Playgroud)

系列未删除,因为通过此消息抛出异常: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

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

Kei*_*thS 13

基本上NHibernate抱怨的是你明确告诉它删除Family的记录,然后当你重新保存Person时,Family将被重新放回原位,因为Person仍然在其中引用它家庭清单.

相反,NHibernate告诉你以NHibernate允许你使用的面向对象的方式处理这种关系.只需从Person.Families列表中删除对"Jaun"系列的引用,然后保留Person.当你这样做时,NHibernate将删除该Family和该Person之间的关系.如果现在不再通过其他任何内容引用族,因为您已将Cascade属性设置为"all-delete-orphan",则"Jaun"族记录将从数据库中完全删除.

  • `person.Families.Remove(FAM); SessionInstance.Save(人);` (2认同)