NHibernate延迟加载和对象比较

时间:2012-10-16 11:18:01

标签: c# nhibernate lazy-loading

配置了延迟加载后,我遇到了有关对象比较的问题。我在每个域实体类中的重写Equals方法包含以下行:

if (obj == null || !obj.GetType().Equals(GetType()))

显然,类型比较将失败,因为obj是一个代理实例。我已经看过一些NHibernate-snippets,它们解开一个对象并返回真实实例。但是当我强制执行域驱动设计时,我不希望在我的域层中使用任何特定于ORM的代码。 我也无法在调用者方面解除实例[例如foo.Equals(Unproxy(bar))]作为调用者是我的应用程序层,它也不包含任何特定于ORM的代码(所有NHibernate依赖项都由Windsor注入)。

长话短说:是否有任何通用代码来获取真实实例?

2 个答案:

答案 0 :(得分:5)

解决这个问题的方法是进行演员表:

public class Person
{
    public int Id { get; set; }

    public override bool Equals(object obj)
    {
        var person = obj as Person;

        if (person == null)
        {
            return false;
        }

        return person.Id == this.Id;
    }
}

演员合作是因为proxy继承自您的班级(例如PersonProxy : Person

空检查是不必要的,因为如果as为空或者不是可以作为人物投射的对象,obj强制转换将返回null。

答案 1 :(得分:3)

或者,您可以创建一个GetTypeUnproxied方法,如下所示:https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/BaseObject.cs

此方法甚至可以使用继承映射,因为它返回代理内部对象的实际类型。