我定义:

[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。

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

当我尝试将 myClass 转换为 DerivedClass 时,我收到此错误(显然),因为我尝试将 BaseClassProxy 对象转换为 DerivedClass。
Unable to cast object of type 'Castle.Proxies.BaseClassProxy' to type 'DerivedClass'.

问题:
  • 如何获取真正分配的对象类型以将其与 DerivedClass 进行比较?
  • 是否可以强制转换 BaseClassProxy 对象以获得 DerivedClass 的实例?。

  • 感谢您的答复。

    最佳答案

    不幸的是,不可能将 NHibernate 代理 BaseClassProxy 转换为 DerivedClass 的实例,因为 BaseClassProxy 将从 BaseClass 继承,因此对您的 DerivedClass 一无所知。为了能够使用它们的类型,您需要做的是将对象取消代理为它们的实际类型,即执行以下操作:

    public T UnProxyObjectAs<T>(object obj)
    {
        return Session.GetSessionImplementation().PersistenceContext.Unproxy(obj) as T;
    }
    
    var derived = UnProxyObjectAs<DerivedClass>(myClass);
    

    其中 Session 是您的 NHibernate session 。

    关于c# - 使用延迟加载的 NHibernate ObjectProxy 类型转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7977952/

    10-11 01:34