问题 每个子类继承策略使用NHibernate表时使用Casting代理的问题


我有一个抽象的基类并继承了poco实体。我使用表每子类继承与流畅的nhibernate 1.1自动化。

类继承如下所示

节点(抽象类) 地点:节点 资产:节点

Node类基本上是树结构。

 public abstract class Node 
    {
        public virtual int Id
        {
            get;
            set;
        }

        public virtual Node ParentNode
        {
            get;
            set;
        }

        public virtual ICollection<Node> ChildNodes
        {
            get;
            set;
        }
}

现在的问题是当我从数据库中获取Asset的对象并且这样做 objAsset.ParentNode,我可以将ParentNode强制转换为Asset或Place,但如果我执行objAsset.ParentNode.ParentNode.ParentNode之类的操作,那么ParentNode将显示为“{Castle.Proxies.NodeProxy}”类型,我无法将其强制转换放置或资产。

我知道在我的情况下,最终结果应该是Place类型,因为记录存在于Place表的数据库中但由于某种原因NHibernate不能将它延迟加载到实际的派生类型,它只能转换为基类Node 。

任何想法?

等待 纳比勒


1395
2017-08-19 15:58


起源



答案:


奥伦在这里很好地解释了这一点: http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

简而言之,代理继承自关联的类型,而不是继承的类型,因为在进入DB之前不知道(并且您无法更改对象的类型)

更新:一种可能的解决方法是在Node中泄漏对实际对象的引用:

public virtual Node Self { get { return this; } }

这将为您提供基础资产或地点。小心一点。


15
2017-08-19 16:23



另外,如文章所述;一个解决方案是禁用对关联的延迟加载,这将为您提供实际对象。 - DanP
请参阅添加的解决方法 - Diego Mijelshon
谢谢deigo ......这很棒。唯一的问题是我必须忽略映射中的Self属性。 - nabeelfarid
<any> 映射也适用于此处 - Firo
谢谢。这对我有用。 - KregHEk


答案:


奥伦在这里很好地解释了这一点: http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

简而言之,代理继承自关联的类型,而不是继承的类型,因为在进入DB之前不知道(并且您无法更改对象的类型)

更新:一种可能的解决方法是在Node中泄漏对实际对象的引用:

public virtual Node Self { get { return this; } }

这将为您提供基础资产或地点。小心一点。


15
2017-08-19 16:23



另外,如文章所述;一个解决方案是禁用对关联的延迟加载,这将为您提供实际对象。 - DanP
请参阅添加的解决方法 - Diego Mijelshon
谢谢deigo ......这很棒。唯一的问题是我必须忽略映射中的Self属性。 - nabeelfarid
<any> 映射也适用于此处 - Firo
谢谢。这对我有用。 - KregHEk