在映射中使用「反向」反轉了「擁有」父母與子女之間關係的概念。通過指定「反向」,NH基本上表現爲好像關係的子方決定它是否屬於父母,而不是父母決定它是否具有孩子。一個很好的現實世界的例子是學生正在註冊一所學院。學生可以選擇不再屬於學院,並且可以作爲實體存在並且有意義。這也是學生,而不是學院,誰是決定是否與大學形成或切斷這種關係的主要決定因素(在現實生活中,是的,有些情況下大學說學生不再受歡迎,但是大學不僅僅告訴一個有良好信譽的學生「你正在輟學」,而是那個告訴大學的學生)。
它的缺點是,通過指定父和子之間的關係作爲反向,NH將關係(父)的「一側」視爲不能存在於關係上下文之外的一側。所以,當你清除所有的孩子時,現在沒有孩子的父母被「孤兒」,NH刪除它。
這聽起來不像你想要的;所以,我會從這個關係中刪除反向映射,允許Parent與它的子節點「擁有」這種關係。刪除所有的孩子,他們成爲孤兒和刪除,但父母仍在。現在,您有一個問題,即由於外鍵不可空,孩子不能成爲「孤兒」他們必須屬於某種東西。 NH要求如果您要使用「孤立刪除」級聯規則,子記錄的FK可以爲空。這是因爲孤立刪除是一個兩步操作,要求記錄首先成爲孤兒,方法是將其FK字段設置爲空。然後,NH將運行第二條語句,從表中刪除具有NULL FK的記錄。因此,即使使用可空的FK字段,通過使用具有所需級聯規則的NH,您也不會有超過瞬態時間段的空FK記錄。
如果這是不可接受的,您將不得不從級聯規則中刪除孤立刪除,並手動刪除每條記錄並將其從Session中刪除。
foreach(var child in parent.Children)
session.Delete(child);
parent.Children.Clear();
session.Update(parent);
感謝這一點 - 在您的反饋這些信息解決了我的問題 - 「NH需要的子記錄的FK爲可以爲空,如果你要使用‘刪除孤兒’級聯規則。」 – 2013-01-06 21:15:23
(繼續上面)...我無法讓我的子記錄刪除,因爲我的子表中的FK被設置爲NOT NULL,並刪除了「列不能包含空值」,因爲正如你所說NH做了2 -pass刪除子項 - 首先將子項設置爲NULL,然後刪除FK = null的地方。 – 2013-01-06 21:22:01