Проблема с приведением прокси при использовании таблицы NHibernate для стратегии наследования подкласса - PullRequest
11 голосов
/ 19 августа 2010

У меня есть абстрактный базовый класс и унаследованные объекты 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 или Asset.

Я знаю, что в моем случае конечный результат должен иметь тип Place, так как запись существует в базе данныхв таблице Place, но по какой-то причине NHibernate не может лениво загрузить его в фактический производный тип, он может быть преобразован только в базовый класс Node.

Есть идеи?

В ожидании Набиля

1 Ответ

15 голосов
/ 19 августа 2010

Это хорошо объясняется Ореном здесь: http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

Короче говоря, прокси наследуют от типа ассоциации, а не от унаследованного типа, потому что это неизвестно до перехода в БД (и вы не можете изменить тип объекта)

Обновление : возможный обходной путь - утечка ссылки на фактический объект в узле:

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

Это даст вам базовый Актив или Место. Будь осторожен с этим.

...