Issue with Casting proxies when using NHibernate table per subclass inheritance strategy

[亡魂溺海] 提交于 2019-11-27 14:57:51

问题


I have got an abstract base class and inherited poco entities. I am using table per subclass inheritance with fluent nhibernate 1.1 automapping.

The class inheritance looks like follows

Node (abstract class) Place : Node Asset : Node

Node class is basically a tree structure.

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

        public virtual Node ParentNode
        {
            get;
            set;
        }

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

Now the problem is when I get an object of Asset from database and do objAsset.ParentNode, I can cast ParentNode to Asset or Place, but if I do something like objAsset.ParentNode.ParentNode.ParentNode, then the ParentNode appears as of type "{Castle.Proxies.NodeProxy}" and I am unable to cast it to Place or Asset.

I know that in my case the end result should be of type Place, as the record exists in the database in Place table but for some reason NHibernate can't lazy load it to the actual derived type, it is only castable to base class Node.

Any idea?

Awaiting Nabeel


回答1:


This is well explained by Oren here: http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

In a nutshell, proxies inherit from the type of the association, not the inherited type, because that is not known before going to the DB (and you can't change the type of an object)

Update: a possible workaround is leaking a reference to the actual object in Node:

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

That will give you the underlying Asset or Place. Be careful with it.



来源:https://stackoverflow.com/questions/3523686/issue-with-casting-proxies-when-using-nhibernate-table-per-subclass-inheritance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!