2014-01-16 51 views
1

我試圖測試以下:分配現有的實體許多到許多不更新一邊

// Arrange 
var alpha = new Alpha { Name = "Hello" }; 
var beta = new Beta { Name = "World" }; 

using (var t = this.Session.BeginTransaction()) 
{ 
    this.Session.Save(alpha); 
    this.Session.Save(beta); 
    t.Commit(); 
} 

// Act 
using (var t = this.Session.BeginTransaction()) 
{ 
    var a = this.Session.Get<Alpha>(1); 
    var b = this.Session.Load<Beta>(1); 

    a.Betas.Add(b); 

    t.Commit(); 
} 

// Assert 
//// this succeeds 
Assert.AreEqual(1, this.Session.Get<Alpha>(1).Betas.Count, "Alpha contains beta"); 
//// this fails 
Assert.AreEqual(1, this.Session.Get<Beta>(1).Alphas.Count, "Beta contains alpha"); fails here 
Assert.AreEqual(1, this.Session.Query<Beta>().Count(), "Only one beta"); 

我的映射是

public AlphaMap() 
{ 
    this.Id(a => a.Id); 
    this.Map(a => a.Name); 
    this.HasManyToMany(a => a.Betas) 
     .Cascade.All() 
     .Table("AlphaBetas") 
     .ParentKeyColumn("AlphaId") 
     .ChildKeyColumn("BetaId"); 
} 

public BetaMap() 
{ 
    this.Id(a => a.Id); 
    this.Id(a => a.Name); 
    this.HasManyToMany(a => a.Alphas) 
     .Cascade.All() 
     .Inverse() 
     .Table("AlphaBetas") 
     .ParentKeyColumn("BetaId") 
     .ChildKeyColumn("AlphaId"); 
} 

我不確定爲什麼多對多關係的Beta版沒有被更新。有人可以解釋給我 - 我是一個NH新手,所以我可能錯過了一些明顯的東西。

回答

1

這裏的要點是,第二個關係沒有在C#中設置。我們只能看到:a.Betas.Add(b);。而這些對象仍在會話中。所以測試是在內存仍然保持對象的基礎上完成的。

在斷言之前調用session.Clear(),最新的數據將被加載......從兩邊正確分配。

注意:還要小心這些多對多的級聯設置。他們不影響配對錶...他們影響另一端

+0

啊'做'session.Clear()'工程!在實施工作單元模式方面,應該在「提交」更改後始終打電話清楚嗎? –

+0

我會說:是的。確切地說,這是我們必須做的。一個操作爲寫...乾淨...其他閱讀!究竟。享受NHiberante;) –