如何在可能是NHibernate代理对象的对象上获取实体类型?
对于与NHibernate一起使用的所有业务对象,我都有一个基类如何在可能是NHibernate代理对象的对象上获取实体类型?,nhibernate,Nhibernate,对于与NHibernate一起使用的所有业务对象,我都有一个基类DomainObject。它包含Id属性 public abstract class DomainObject { public virtual int Id { get; private set; } } 我想写一个IEqualityComparer来比较我的域对象。如果两个对象具有相同的Id,并且是同一类型的对象,则它们应该相等。但是,当我使用GetType()获取对象的类型时,它将返回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可能会返回代理类型。请参阅此线程以了解解决此问题的另一种方法: