【问题标题】:Issue with Casting proxies when using NHibernate table per subclass inheritance strategy每个子类继承策略使用 NHibernate 表时转换代理的问题
【发布时间】:2010-08-19 15:58:39
【问题描述】:

我有一个抽象基类和继承的 poco 实体。我使用流利的 nhibernate 1.1 自动映射的每个子类继承表。

类继承如下所示

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

节点类基本上是一个树形结构。

 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 不能将其延迟加载到实际的派生类型,它只能转换为基类节点。

有什么想法吗?

等待 纳比尔

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping lazy-loading


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 另外,如文章中所述;一种解决方案是禁用关联的延迟加载,这将为您提供实际对象。
    • 感谢 deigo ... 效果很好。唯一的问题是我不得不忽略映射中的 Self 属性。
    • &lt;any&gt; 映射也适用于此
    猜你喜欢
    • 2011-07-29
    • 2013-09-17
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多