0

我一直在單元測試中使用NBuilder來模擬內存中的數據,它很棒,然後我想用它來測試我的NHibernate映射,我認爲它會變得透明但我不明白我在做什麼錯=(它根本不工作使用NBuilder測試NHibernate映射

我打算嚴重測試我的NHibernate映射,但由於我有太多的實體,我不想手動填充數據,這是主要我之所以要使用NBuilder

只是作爲快速參考:

 autoConfig.Override<Planet>(x => 
     { 
      x.References(y => y.Sun).Cascade.SaveUpdate().Column("Star_id"); 
     }); 
     autoConfig.Override<Star>(y => 
     { 
      y.HasMany(x => x.Planets).Inverse().Cascade.AllDeleteOrphan(); 
     }); 

(如果你需要我可以提供有關實體和映射的信息,但我認爲他們是正確的,因爲我能夠拯救我的實體數據時手動填充)

手動:

using (var session = factory.OpenSession()) 
using (var tran = session.BeginTransaction()) 
{ 
    var star = new Star { Class = StarTypes.B, Color = SurfaceColor.Red, Mass = 323.43, Name = "fu..nny star" }; 
    star.Planets = new List<Planet> 
    { 
     new Planet { IsHabitable = true, Name = "my pla", Sun = star } 
    }; 
    session.Save(star); 
    tran.Commit(); 
} 

上面的代碼實際工作兩個實體保存到數據庫中正確的意思是我的映射是正確的,但現在我想用NBuilder自動填入測試數據是這樣的:

var star = Builder<Star>.CreateNew().Build(); 
star.Planets = Builder<Planet>.CreateListOfSize(10).All().With(x => x.Sun, star).Build(); 
session.Save(star); 
tran.Commit(); 

Inspectin克生成的實體,而調試看起來是正確的給我,我可以瀏覽這些沒有問題,但是當我要提交我得到以下錯誤的交易:

行被其它事務更新或刪除(或者未保存 - 值映射不正確):[CH9_NHibernateLinqToNHibernate.Domain.Planet#00000000-0000-0000-0000-000000000001]

有什麼想法?

回答

0

我發現這個問題,基本上NBuilder爲我的ID分配了一個值,而且NHibernate正在考慮它'持續',它試圖更新記錄而不是創建一個新的記錄(雖然錯誤信息並沒有幫助我...):

var star = Builder<Star>.CreateNew().Build(); 
star.Planets = Builder<Planet>.CreateListOfSize(10).All().With(x => x.Sun, star).With(x => x.Id, Guid.Empty).Build();