使用延迟加载的NHibernate ObjectProxy转换

时间:2011-11-02 09:17:13

标签: c# nhibernate casting lazy-loading proxy-classes

我定义:

[ActiveRecord("BaseEntity", Lazy = true )]
class BaseClass {}

[ActiveRecord("DerivedEntity", Lazy = true )]
class DerivedClass : BaseClass {}

在DB BaseEntity中,DerivedEntity为1 = 1

我创建:

BaseClass myClass = New DerivedClass();

问题:

当我试着问

myClass is DerivedClass

我得到“假”,因为myClass不是DerivedClass而是BaseClassProxy。

没有Lazy Loading,NHibernate不会创建代理对象,我也没有这个问题。

当我尝试将myClass转换为DerivedClass时,我得到了这个错误(显然),因为我尝试将BaseClassProxy对象转换为DerivedClass。

Unable to cast object of type 'Castle.Proxies.BaseClassProxy' to type 'DerivedClass'.

问题:

  1. 如何获取实际分配的对象类型以将其与DerivedClass进行比较?

  2. 是否可以转换BaseClassProxy对象以获取DerivedClass的实例?

  3. 感谢您的回复。

1 个答案:

答案 0 :(得分:10)

不幸的是,由于BaseClassProxy将从DerivedClass继承,因此无法将NHibernate代理BaseClassProxy强制转换为BaseClass的实例,因此对DerivedClass一无所知1}}。你需要做的是能够使用它们的类型是对它们的实际类型的对象是unproxy,即做类似的事情:

public T UnProxyObjectAs<T>(object obj)
{
    return Session.GetSessionImplementation().PersistenceContext.Unproxy(obj) as T;
}

var derived = UnProxyObjectAs<DerivedClass>(myClass);

Session是您的NHibernate会话。