我有兩個實體(父和子)之間的父子關係。從集合中刪除一個項目(NHibernate)
我父母映射如下:
<class name="Parent" table="Parents">
...
<bag name="Children" cascade="all">
<key column="ParentID"></key>
<one-to-many class="Child"></one-to-many>
</bag>
</class>
我想執行如下:
someParent.Children.Remove(someChild);
子類有另一個父類的引用,類型。的關係看起來像
注:我爲無鏈接的URL上面道歉,我似乎無法讓過去使用標記
在URL字符串中的星號由於這種關係,當調用上述代碼而不是DELETE查詢時,會生成一個UPDATE查詢,該查詢從Child表中刪除ParentID(設置爲空)。
當從Parent.Children集合中刪除時,是否可以強制NHibernate完全刪除子記錄?
UPDATE
@斯賓塞的解決方案
非常具有吸引力的解決方案,因爲這是不能夠在未來的類實現。但是,由於存儲庫模式中的會話處理方式(在我的具體情況下),這幾乎是不可能的,因爲我們必須根據應用程序傳遞會話類型(CallSessionContext/WebSessionContext)。
@傑米的解決方案
簡單快速實施,但我已經打了另一個路障。我的子實體如下所示:
當使用新方法時,NHibernate生成一個更新語句,將TypeID和ParentID設置爲null,而不是單個刪除徹底。如果我在執行過程中遺漏了某些東西,請告訴我,因爲這種方法很容易實現。
@The One-Shot-Delete solution described here,概述瞭解引用集合強制單個刪除的想法。然而,與上述結果相同,會發布更新聲明。
//Instantiate new collection and add persisted items
List<Child> children = new List<Child>();
children.AddRange(parent.Children);
//Find and remove requested items from new collection
var childrenToRemove = children
.Where(c => c.Type.TypeID == 1)
.ToList();
foreach (var c in childrenToRemove) { children.Remove(m); }
parent.Children = null;
//Set persisted collection to new list
parent.Children = Children;
解決方案
花了一點挖,但傑米的解決方案來通過與一些額外的修改。對於未來的讀者,根據我的類模型上面:
類型映射 - 逆=真正的,級聯=所有
父映射 - 逆=真正的,級聯=全刪除,孤兒
刪除方法爲在Jamie的解決方案中描述。這確實會爲每個孤兒項目生成一條刪除語句,所以有可能在將來進行調優,但最終結果是成功的。
我相信這可能引發了我走上正確的道路,路障是:將其設置爲存儲庫模式(即,在這種情況下,子刪除方法將調用其自己的存儲庫方法),並且能夠使用這與不同的會話上下文(即,CallSessionContext vs WebSessionContext) – 2010-02-16 23:06:42