2009-09-24 51 views
1

我想要使用NHibernate有一個簡單的一對多關係/層次結構。我想孤兒被自動刪除,但是我目前的嘗試都是由ObjectDeletedException引起的。我想知道如果有人能告訴我我做錯了什麼。NHibernate:簡單刪除孤兒場景不起作用

編輯:

我應該已經指定了我加載根美孚,然後除去孩子的會話之外,導致被孤立的一個或更多的孩子。當我在第二個會話中隨後調用SaveOrUpdate(root)時發生異常。我如何糾正分離和修改的對象與數據庫中持久化的對象之間的子項列表中的差異?

問題

示例代碼看起來是這樣的:

Foo foo = new Foo(); 
Foo child1 = new Foo(); 
Foo child2 = new Foo(); 

foo.Children.Add(child1); 
child1.Children.Add(child2); 

// session #1 
session.SaveOrUpdate(foo); 

// so far, so good 

// outside of any session 
foo.Children.Clear(); 

// session #2 
PutFoo(foo); // results in ObjectDeletedException 

對象正在持續:

class Foo 
{ 
    private IList<Foo> children = new List<Foo> children; 

    public virtual int Id { get; private set; } 
    public IList<Foo> Children 
    { 
     get { return children; } 
     set { children = value; } 
    } 
} 

的FluentNHibernate映射:

class FooMap : ClassMap<SyncDir> 
{ 
    public FooMap() 
    { 
     Id(x => x.Id); 
     base.HasMany(x => x.Children).Cascade.AllDeleteOrphan(); 
    } 
} 

用於保留一個對象的方法Foo類型:

void PutFoo(Foo foo) 
{ 
    using (var session = factory.OpenSession()) 
    using (var transaction = factory.BeginTransaction()) 
    { 
     session.SaveOrUpdate(foo); 
     transaction.Commit(); 
    } 
} 

回答

1

我總是這樣做,是建立一種雙向關係。

所以,這意味着孩子有一個參考他們的父母。 從集合中刪除一個子項時,我也將對父項的引用設置爲NULL。

在映射中,您還必須指出關係的'反向'結束。 我也從不在課堂外暴露'原樣'的集合。

因此,我主要是做這樣的:

public class Foo 
{ 
    private ISet<Bar> _bars = new HashSet<Bar>(); 

    public ReadOnlyCollection<Bar> Bars { get return new List<Bar>(_bars).AsReadOnly(); } 

    public void AddBar(Bar b) 
    { 
     b.Parent = this; 
     _bars.Add (b); 
    } 

    public void RemoveBar(Bar b) 
    { 
     b.Foo = null; 
     _bars.Remove (b); 
    } 
} 


public class Bar 
{ 
    public Foo Parent { get; set; } 
} 

然後,在映射我設置的集合「逆」端。 所以,這意味着在我的映射中(我仍然使用xml文件來指定映射),我在Foo類的Bars集合上設置了inverse = true屬性。

+0

我添加了Parent和Add()/ Remove()方法,但在刪除子項後,在根節點上調用SaveOrUpdate()時仍然收到異常。我應該提到我加載根,然後在會話外調用Remove()。只有在刪除子項並從第二個會話中調用SaveOrUpdate()時,纔會發生異常。 – anthony 2009-09-25 19:20:42