使用延迟加载的NHibernate ObjectProxy转换

man*_*llt 4 c# nhibernate casting lazy-loading proxy-classes

我定义:

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

[ActiveRecord("DerivedEntity", Lazy = true )]
class DerivedClass : BaseClass {}
Run Code Online (Sandbox Code Playgroud)

在DB BaseEntity和DerivedEntity中,1 = 1

我创造:

BaseClass myClass = New DerivedClass();
Run Code Online (Sandbox Code Playgroud)

问题:

当我试着问

myClass is DerivedClass
Run Code Online (Sandbox Code Playgroud)

我得到"假",因为myClass不是DerivedClass而是BaseClassProxy.

没有延迟加载,NHibernate不会创建代理对象,我没有这个问题.

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

Unable to cast object of type 'Castle.Proxies.BaseClassProxy' to type 'DerivedClass'.
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

感谢您的答复.

Joh*_*mer 10

遗憾的是,不可能将NHibernate代理强制转换BaseClassProxy为一个实例,DerivedClass因为BaseClassProxy遗嘱将继承,BaseClass因此对你的知识一无所知DerivedClass.你需要做的是能够使用它们的类型是对它们的实际类型的对象是unproxy,即做类似的事情:

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

var derived = UnProxyObjectAs<DerivedClass>(myClass);
Run Code Online (Sandbox Code Playgroud)

Session是你的NHibernate会话.