如何在可能是NHibernate代理对象的对象上获取实体类型?

Jef*_*ger 14 nhibernate

我有一个基类DomainObject用于我在NHibernate中使用的所有业务对象.它包含该Id属性.

public abstract class DomainObject
{
    public virtual int Id { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

我想写一个IEqualityComparer比较我的域对象.如果两个对象具有相同Id且对象类型相同,则它们应该相等.但是当我GetType()用来获取对象的类型时,它将返回NHibernate代理类型.所以这段代码:

bool IEqualityComparer.Equals(object x, object y)
{
    // null checking code skipped here
    if(x is DomainObject && y is DomainObject)
    {
            return ((DomainObject) x).Id == ((DomainObject) y).Id
                    && x.GetType() == y.GetType();
    }
    return x.Equals(y);
}
Run Code Online (Sandbox Code Playgroud)

不能正常工作,因为类型x is Asset而且类型y is AssetProxy21879bba3e9e47edbbdc2a546445c657.

那么,如何在可能是NHibernate代理对象的对象上获取实体类型?即在上面的例子Asset而不是AssetProxy21879bba3e9e47edbbdc2a546445c657

Jef*_*ger 22

您可以通过以下方式获取代理的真实类型:

NHibernateUtil.GetClass(x);
Run Code Online (Sandbox Code Playgroud)

或者你可以添加一个方法DomainObject:

public virtual Type GetTypeUnproxied()
{
    return GetType();
}
Run Code Online (Sandbox Code Playgroud)

这真的很光滑,并不直接依赖于NHibernate.

另外,我们可以说,你需要获得真正的对象,而不是代理,其中,如果会话是得心应手,是可以做到的解决这个问题:

session.PersistenceContext.Unproxy(x);
Run Code Online (Sandbox Code Playgroud)

正如另一个答案所提到的,如果你试图实现equals,那么查看Sharp的Sharp架构实现是一个好主意.