Кастинг NHibernate ObjectProxy с отложенной загрузкой - PullRequest
4 голосов
/ 02 ноября 2011

Я определяю:

[ActiveRecord("BaseEntity", Lazy = true )]
class BaseClass {}

[ActiveRecord("DerivedEntity", Lazy = true )]
class DerivedClass : BaseClass {}

В БД BaseEntity и DerivedEntity равны 1 = 1

Я создаю:

BaseClass myClass = New DerivedClass();

Проблема:

Когда я пытаюсь спросить

myClass is DerivedClass

я получаю "ложь", потому что myClass не является DerivedClass, а является BaseClassProxy.

Без отложенной загрузки NHibernate не создает прокси-объект, и у меня нет этой проблемы.

Когда я пытаюсь привести myClass к DerivedClass, я получаю эту ошибку (очевидно), потому что я пытаюсь привести объект BaseClassProxy к DerivedClass.

Unable to cast object of type 'Castle.Proxies.BaseClassProxy' to type 'DerivedClass'.

Вопросы:

  1. Как я могу получить реальный назначенный тип объекта, чтобы сравнить его с DerivedClass?.

  2. Можно ли привести объект BaseClassProxy для получения экземпляра DerivedClass?.

Спасибо за ответы.

1 Ответ

10 голосов
/ 02 ноября 2011

К сожалению, невозможно привести прокси NHibernate BaseClassProxy к экземпляру DerivedClass, так как BaseClassProxy будет наследоваться от BaseClass и поэтому ничего не знает о вашем DerivedClass.Вместо этого вам нужно сделать так, чтобы использовать их типы, чтобы разархивировать объекты к их фактическим типам, то есть сделать что-то вроде:

public T UnProxyObjectAs<T>(object obj)
{
    return Session.GetSessionImplementation().PersistenceContext.Unproxy(obj) as T;
}

var derived = UnProxyObjectAs<DerivedClass>(myClass);

Где Session - ваша сессия NHibernate.

...