【问题标题】:How do I compare an object with an NHibernate proxy object?如何将对象与 NHibernate 代理对象进行比较?
【发布时间】: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


    【解决方案1】:

    我认为您需要在您的实体中覆盖 GetHashCodeEquals

    【讨论】:

    • 这就是 Compare .NET Objects 应该做的事情,所以我不必在每个 POCO 中覆盖它们,然后在 POCO 更改时更新它们。
    • 我将您的答案标记为正确答案,因为我真的很喜欢 Fluent NHibernate :)。继续努力!
    【解决方案2】:

    比较 .NET 对象是正确的,因为实例不同(类型不同,正如您自己所说的那样,它是一个代理)。

    在几年前使用 NHibernate 的项目中,我们必须为我们的实体“层超类型”实现我们自己的 GetUnderlyingType()(从 Enum 类中窃取的名称)。

    GetUnderlyingType() 仅返回基类的类型(如果它是代理)。

    然后在我们的 Equals() 方法中使用该方法,而不是 GetType()(如教科书中使用的那样,由 R# 等使用)。

    【讨论】:

    • 没错。我通过下载比较 .NET 对象的源代码并禁用 GetType() 相等性检查来解决这个问题。这意味着您必须传入相同的类型,否则它会在某些时候抛出异常,但考虑到我只是用它来比较 POCO,我愿意接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2012-01-21
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多