У меня проблема с неинициализированными прокси в 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, все свойства являются постоянными, и все, что может быть ленивым, загружается, лениво загружается.
Бизнес-логика приложения позволяет вам установить Собака в DogOwner и Cat в CatOwner.
Проблема
У меня такой код:
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
Этот метод может быть вызван многими различными способами, в большинстве случаев собака уже находится в памяти, и все в порядке, но редко собака еще не в памяти - в этом случае я получаю nhibernate "неинициализированный прокси", но cast бросает исключение, потому что nhibernate кодирует прокси для Animal, а не для Dog.
Я понимаю, что так работает nhibernate, но мне нужно знать тип без загрузки объекта - или, вернее, мне нужен неинициализированный прокси-сервер для прокси-сервера Cat или Dog, а не для прокси-сервера Animal.
Ограничения
- Я не могу изменить модель домена, модель передана мне другим отделом, я попытался заставить их изменить модель и не удалось.
- Фактическая модель намного сложнее, чем пример, и классы имеют много ссылок между ними, используя загрузку или добавление объединений к запросам, не может быть и речи по причинам производительности.
- У меня есть полный контроль над исходным кодом, отображением hbm и схемой базы данных, и я могу их изменить любым способом (до тех пор, пока не меняю отношения между классами модели).
- У меня много методов, как в примере, и я не хочу изменять их все.
Спасибо,
Nir