2010-03-05 177 views
6

的情況如下,NHibernate的不級聯刪除兒童

我有3個對象(我簡化了名稱)命名父母,父母的孩子&孩子的孩子
父母的孩子是在父母一集,孩子的孩子是一羣孩子。

映射如下所示(相關部分)

<set name="parentset" 
    table="pc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column=FK_ID_PC" on-delete="cascade"/> 
    <one-to-many class="parentchild,parentchild-ns"/> 
</set> 

父母的孩子

<set name="childset" 
    table="cc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column="FK_ID_CC" on-delete="cascade"/> 
    <one-to-many class="childschild,childschild-ns"/> 
</set> 

我想要實現的是,當我刪除父,會有一個級聯刪除一路到孩子的小孩的槽。但目前發生的是這樣的。

(這純粹是爲了映射測試目的) 得到一個父實體(正常工作)

IQuery query = session.CreateQuery("from Parent where ID =" + ID); 
IParent doc = query.UniqueResult<Parent>(); 

現在刪除部分

session.Delete(doc); 
transaction.Commit(); 

已經解決了「不能插入空值」後錯誤與級聯和反轉我希望這將現在刪除與此代碼的一切,但只有父母被刪除。

我錯過了我的地圖中可能會被錯過的東西嗎?正確方向的任何提示都非常值得歡迎!


迭戈,謝謝你的提問。 (和解釋)

我去除了on-delete="cascade",這是因爲我喜歡在代碼中儘可能多地控制,而不是在數據庫中。

下面發佈的代碼是(工作)結果。

<set name="parentset"  
    table="pc-table"  
    cascade="all-delete-orphan"  
    inverse="true" 
    batch-size="5">  
    <key column=FK_ID_PC"/>  
    <one-to-many class="parentchild,parentchild-ns"/>  
</set> 

父母的孩子

<set name="childset"    
    table="cc-table"  
    cascade="all-delete-orphan" 
    batch-size="5" 
    inverse="true">    
    <key column="FK_ID_CC">    
    <one-to-many class="childschild,childschild-ns"/>    
</set> 

希望這有助於人同樣的問題!

回答

6

通過在鍵上設置on-delete="cascade",您讓DB處理級聯。

你是用NHibernate生成你的模式嗎?

我剛剛重現你的例子,它工作得很好,沒有該屬性。刪除它時,NHibernate會進行級聯。

順便說一句,使用lazy="false" fetch="subselect"不是你應該默認做的事情。如果刪除這些屬性,請保留on-delete="cascade"並將cascade更改爲save-update,則只會有兩個查詢來檢索和刪除父項。