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