свободный дискриминатор nhibernate из соответствующей таблицы - PullRequest
3 голосов
/ 26 февраля 2012

У меня есть следующие 3 таблицы с примерами значений

Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )

У меня есть

public class Concrete1 : Vehicle
{

}

И я хочу, чтобы nhibernate создавал Concrete1 при загрузке транспортного средства # 1 в

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

Как я могу сделать это с autoppings? Заранее спасибо.

Edit1

Я начинаю думать, что это невозможно, поэтому любой обходной путь был бы оценен. Любая подсказка для xml (не беглой) версии также может быть очень полезна.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

ОК, во-первых, плохие новости.

  • Дискриминатор не может быть в отдельной таблице, точка.Вы можете обойти это, используя оператор select с объединением в качестве источника table, но тогда ваша сущность будет фактически доступна только для чтения.Или вы можете использовать представление, которое могло бы работать, но делегировать больше работы в БД.
  • Даже при правильном отображении session.load<Vehicle>(1) никогда не вернет производный тип (кроме случаев, когда вы отключаете ленивую загрузку, котораяплохая идея, или если конкретный экземпляр уже был загружен как таковой в сеансе).Вы можете получить конкретный экземпляр с помощью этого хака .

Теперь ваша модель данных выглядит так, как будто она будет работать лучше с отношением Vehicle has-a Type, чем с <ConcreteVehicle> is-a Vehicle.

Это дает вам больше гибкости (например, вы можете изменить тип транспортного средства), и вы можете сохранить свойства полиморфизма, используя шаблон стратегии (тип транспортного средства содержит поведение).

0 голосов
/ 28 февраля 2012

Я думаю, что этот пост в блоге nhibernate.info делает то, что вы ищете.

http://nhibernate.info/blog/2011/02/16/get-load-polymorphism-in-nhibernate-3.html

Если нет, то это может дать вам представление.

...