9

重新保存我有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); 

家庭没有被删除,因为此消息抛出一个异常: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

如何删除一个家族的人?

回答

13

基本上NHibernate抱怨的是你明确告诉它删除一个家庭记录,那么当你重新保存该人时,家人将被放回原位,因为该人仍然有一个参考到它的家庭列表中。

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

+2

'person.Families.Remove(fam); SessionInstance.Save(person);' –

+0

@Cole W:的确如此。 – KeithS