【发布时间】:2009-11-18 23:29:21
【问题描述】:
我正在使用Compare .NET Objects 来测试我的 POCO 是否正确保存到测试数据库中。我们以 POCO 为例:
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(),即使两个对象的类型不同,它也可以正常工作。我的问题是,当我尝试使用 Compare .NET Objects 时,如何让 NHibernate '透明地'返回对象而不是代理?还是比较 .NET 对象与 NHib 不兼容?
其他信息:
我正在使用比较 .NET 对象,因此我不必为每个属性编写相等测试。我的 POCO 可能必须改变,如果我有一个可以使用反射进行深度比较的工具,这将有很大帮助。
另外,我知道我可以通过在我的映射类中使用它来使属性不延迟加载:
References(x => x.Noah).Not.LazyLoad().Cascade.All();
但这对我来说是最后的选择,因为它消除了延迟加载的好处。
【问题讨论】:
标签: nhibernate fluent-nhibernate proxy comparison lazy-loading