2010-02-25 83 views
2

我正在與NHibernate項目的類類似以下內容:Nhibernate - 如何刪除孩子?

public class Parent { 
    public IList Children {get;set;} 
    // ... 
} 

public class Child { 
    // ... 
} 

我已經得到了兒童屬性設置爲層疊所有/刪除孤兒。由於我使用的是聚合模式,並且Child類的實例只能在Parent的上下文中引用,所以我沒有ChildRepository直接刪除子代 - 只有ParentRepository。但是,當我檢索父對象並調用Parent.Children.Clear()時,數據庫中的子項不會被刪除。我怎樣才能做到這一點?

回答

3

刪除子實體很簡單 - 只需將它們從集合中刪除,然後保存父實體。該集合應映射到全部刪除孤兒。

parent.Children.Clear(); 
session.Save(parent); 

// or 
parent.Children.RemoveAt(0); 
session.Save(parent); 

如果沒有Save()調用,那麼也可以這樣做,除非FlushMode是Never。

session.BeginTransaction(); 
parent.Children.Clear(); 
session.Transaction.Commit(); 

使用@克里斯的的UnitOfWork abstractionm這可能看起來像:

using (var uow = new UnitOfWork()) { 
    parent.Children.Clear(); 
} 
+0

但問題是,我使用存儲庫模式,我不具有對會話對象的直接訪問。我將所有內容都包裝在一個IUnitOfWork實例中,該實例抽象會話對象+事務並在實例提交NHibernate事務的最後工作單元上調用Commit()。 – Chris 2010-02-25 16:38:24

+1

我想我只需要將Save方法添加到我的存儲庫基類中。顯然,儘管我直到現在還沒有需要它,但這是我框架中一個相當大的漏洞。 – Chris 2010-02-25 16:50:56