我使用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