2010-04-28 72 views
2

使用NHibernate構建了大部分DAL後,我發現SQL Server的Cascade On Delete規則也需要在我的HBM文件中考慮。我一直在爲我的所有藏品使用手提袋,但似乎沒有辦法爲袋子添加cascade =「delete」屬性。我可以將所有行李更改爲集合,但這似乎意味着我將我的模型上的所有IList <> s更改爲PersistentGenericSet <>,我不太喜歡這樣做。Hibernate級聯刪除包

有什麼建議嗎?

安東尼

回答

4

有兩個獨立的,但相關的概念:NHibernate的級聯規則,DB級聯。

後者是key元素上實際配置時,如果FK有ON DELETE CASCADE,這是包應該是什麼樣子:

<bag name="Children" ...> 
    <key column="ParentId" on-delete="cascade"/> 
    <one-to-many class="Child"/> 
</bag> 
+0

這是正確的,但我想指出,從NHibernate創建數據庫腳本時使用on-delete設置。它將通過刪除級聯創建一個外鍵。它不會級聯刪除你的對象。 – 2010-04-28 15:04:48

+0

實際上,它修改了NHibernate的行爲,因爲它現在意識到*在刪除級聯*行爲上的存在,因此,如果您有'cascade =「all」',它將依賴於DB來執行它而不是刪除子對象一個接一個。 – 2010-04-28 18:43:39

+0

剛剛嘗試過,我得到以下錯誤: 只有反向一對多關聯可能會使用on-delete =「cascade」 – littlecharva 2010-04-29 10:03:56

2

您可以添加一個級聯屬性包映射。 documentation列出了屬性cascade="all|none|save-update|delete|all-delete-orphan"的幾個選項。一對多關係中最常用的選項是all-delete-orphan。將級聯設置爲此值將導致所有數據庫操作級聯到集合,並且如果將子對象從集合中刪除(孤立),子對象將被刪除。

數據庫級聯類似,但不提供自動刪除孤兒子記錄的功能。在NHibernate和數據庫中設置級聯選項有點多餘,但如果您有其他系統直接訪問數據庫,可能會很有用。