gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:58:00 26 4
gpt4 key购买 nike

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

类继承如下所示

节点(抽象类)
地点:节点
Assets :节点

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

 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}”类型,并且我无法转换它放置或 Assets 。

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

任何的想法?

等待
纳比尔

最佳答案

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; } }

这将为您提供基础 Assets 或位置。小心点。

关于nhibernate - 每个子类继承策略使用 NHibernate 表时的 Casting 代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com