У меня проблема с неинициализированными прокси в nhibernate
Модель предметной области
Допустим, у меня есть две параллельные иерархии классов: Animal, Dog, Cat и AnimalOwner, DogOwner, CatOwner, где Dog и Cat наследуются от Animal, а DogOwner и CatOwner наследуются от AnimalOwner. AnimalOwner имеет ссылку типа Animal с именем OwnedAnimal.
Вот классы в примере:
public abstract class Animal
{
// some properties
}
public class Dog : Animal
{
// some more properties
}
public class Cat : Animal
{
// some more properties
}
public class AnimalOwner
{
public virtual Animal OwnedAnimal {get;set;}
// more properties...
}
public class DogOwner : AnimalOwner
{
// even more properties
}
public class CatOwner : AnimalOwner
{
// even more properties
}
Классы имеют правильное отображение nhibernate, все свойства являются постоянными, а все, что может быть загружено с отложенной загрузкой, загружается с отложенной загрузкой.
Бизнес-логика приложения позволяет устанавливать только Dog в DogOwner и Cat в CatOwner.
Проблема
У меня есть такой код:
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
Этот метод может вызываться многими различными методами, в большинстве случаев собака уже в памяти, и все в порядке, но редко собака не находится в памяти - в этом случае я получаю nhibernate "неинициализированный прокси", но приведение вызывает исключение, потому что nhibernate создает прокси для Animal, а не для Dog.
Я понимаю, что так работает nhibernate, но мне нужно знать тип без загрузки объекта - или, более правильно, мне нужно, чтобы неинициализированный прокси был прокси Cat или Dog, а не прокси Animal.
Ограничения
- Я не могу изменить модель домена, модель передана мне другим отделом, я попытался заставить их изменить модель, но потерпел неудачу.
- Фактическая модель намного сложнее, чем пример, и классы имеют много ссылок между ними, поэтому из-за производительности не может быть и речи о загрузке или добавлении объединений в запросы.
- У меня есть полный контроль над исходным кодом, отображением hbm и схемой базы данных, и я могу изменить их так, как я захочу (если я не изменю отношения между классами модели).
- У меня есть много методов, подобных приведенному в примере, и я не хочу изменять их все.
Спасибо
Nir