Проблема с приведением прокси при использовании таблицы NHibernate для стратегии наследования подкласса
У меня есть абстрактный базовый класс и унаследованные объекты 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 не может лениво загрузить ее в фактический производный тип, он может быть преобразован только в базовый класс Node,
Любая идея?
В ожидании Набиэль
1 ответ
Это хорошо объясняется Ореном здесь: 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; } }
Это даст вам основной актив или место. Будь осторожен с этим.