我有一个基类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架构实现是一个好主意.
| 归档时间: |
|
| 查看次数: |
4194 次 |
| 最近记录: |