Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在可能是NHibernate代理对象的对象上获取实体类型?_Nhibernate - Fatal编程技术网

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

如何在可能是NHibernate代理对象的对象上获取实体类型?,nhibernate,Nhibernate,对于与NHibernate一起使用的所有业务对象,我都有一个基类DomainObject。它包含Id属性 public abstract class DomainObject { public virtual int Id { get; private set; } } 我想写一个IEqualityComparer来比较我的域对象。如果两个对象具有相同的Id,并且是同一类型的对象,则它们应该相等。但是,当我使用GetType()获取对象的类型时,它将返回NHibernate代理类型。所

对于与NHibernate一起使用的所有业务对象,我都有一个基类
DomainObject
。它包含
Id
属性

public abstract class DomainObject
{
    public virtual int Id { get; private set; }
}
我想写一个
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);
}
无法正常工作,因为
x的类型是Asset
,而
y的类型是assetProxy 21879BBA3E9E47EDBBDC2A546445C657


那么,如何获取可能是NHibernate代理对象的对象上的实体类型呢?i、 e.在上面的示例中,
Asset
而不是
assetproxy 21879bba3e9e47edbbdc2a546445c657

要获取真实对象而不是代理,您可以使用

session.PersistenceContext.Unproxy(proxyObject)

但我认为你应该考虑平等

您可以按照所述实现后门属性以获取实际的非代理实例。

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

NHibernateUtil.GetClass(x);
或者您可以向
DomainObject
添加方法,如:

public virtual Type GetTypeUnproxied()
{
    return GetType();
}
这是非常光滑的,不直接依赖于NHibernate

或者,可以通过以下方式解决问题:您需要获取真实对象,而不是代理,如果会话方便,可以使用代理完成:

session.PersistenceContext.Unproxy(x);

正如在另一个答案中提到的,如果您正在尝试实现equals,那么最好检查一下。我在一个生产项目中采用了不同的方法。我只是有一个全局HiLow Id生成器,它为所有类型生成唯一的Id,然后我可以:

// in DomainEntity
public override bool Equals(object obj)
{
    var other = obj as DomainEntity;
    if (Id == 0) // IsTransient()
        return ReferenceEquals(this, other);
    else
        return (other != null) && (Id == other.Id);
}

// Comparer
bool IEqualityComparer.Equals(object x, object y)
{
    return object.Equals(x, y);
}

我99%确定这是重复的,但我现在懒得去搜索:-)请给我看它重复的那一个,我在stackoverflow上到处找。应该注意的是,他可能对GetTypeUnproxied()更感兴趣方法中的-but+1作为一个好的引用impl。在这种情况下,我实际上没有在这段代码中提供会话。感谢Sharp架构中对Equals的引用,它不适用于我,因为我正在为测试编写Equals,所以它不必处理所有情况,但它仍然是一个很好的参考。感谢Dan提供了GetTypeUnproxied()代码的链接,这正是我感兴趣的地方。请注意,如果您使用Castle Windsor,GetClass可能会返回代理类型。请参阅此线程以了解解决此问题的另一种方法: