我有一个抽象基类并继承了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。
有什么想法吗?
等待 纳比尔
答案 0 :(得分:15)
Oren在这里很好地解释了这一点: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; } }
这将为您提供基础资产或地点。小心它。