我使用Compare .NET Objects來測試我的POCO是否正確地保存到測試數據庫。讓我們舉個例子POCO:如何將對象與NHibernate代理對象進行比較?
public class NoahsArk
{
public virtual Noah Noah { get; set; }
}
和映射文件,使用FNH:
public class NoahsArkMap : ClassMap<NoahsArk>
{
References(x => x.Noah).Cascade.All();
}
現在,我運行此代碼:
var noahsArk = new NoahsArk { new Noah() }; // create a new ark
var dbNoahsArk = database.SaveAndLoad(noahsArk); // saves the ark to the db and loads it again into another object
Assert.That(new CompareObjects().Compare(noahsArk, dbNoahsArk), Is.True); // will return true if all properties (including collections) are equal
的Assert()
失敗,因爲它認爲noahsArk.Noah
爲一個Noah
對象,但dbNoahsArk.Noah
作爲一個NHibernate代理對象。我不知道是什麼的NHibernate正在做的背景,因爲如果我這樣做,而不是:
Assert.That(noahsArk.Noah, Is.EqualTo(dbNoahsArk.Noah));
它正常工作,即使兩個對象的類型是不同的,如果我做兩個GetType()
。我的問題是,如何讓NHibernate在我嘗試使用Compare .NET對象時透明地返回對象而不是代理?或者比較.NET對象與NHib不兼容?
附加信息:
我使用比較.NET對象,所以我不必寫每個屬性相等測試。我的POCO可能不得不改變,如果我有一個可以使用反射進行深入比較的工具,它將會有很大的幫助。
另外,我知道我可以在我的映射類使用此讓物業不懶負載:
References(x => x.Noah).Not.LazyLoad().Cascade.All();
但是,這將是我最後的選擇,因爲它消除了延遲加載的好處。
這就是比較.NET對象應該做的事情,所以我不必在每個POCO中覆蓋這些對象,然後在POCO更改時更新它們。 – 2009-11-19 21:36:14
我標記你的答案是正確的,因爲我真的很喜歡流利NHibernate :)。保持良好的工作! – 2009-11-21 00:29:03