Как я могу создать свободную nh таблицу классов для класса, который имеет дочернюю таблицу для каждого класса? - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь выяснить, как заменить автоматическое сопоставление, которое работает с картами классов в беглом nhibernate.Вот мой текущий сценарий:

У меня есть сущность "Foo", для которой сущности "FooSubclassA" и "FooSubclassB" являются подклассами.Там нет столбца дискриминатора, так как они используют одинаковые идентификаторы и SubclassMap.Это прекрасно работает;Я могу получить списки FooSubclassA и FooSubclassB и увидеть свойства, которые наследуются с помощью «Foo».

Моя проблема в том, что теперь у меня есть класс «Bar», который имеет свойство «один к одному», равное «Foo».Я хочу, чтобы этот экземпляр Foo был либо FooSubclassA, либо FooSubclassB, в зависимости от того, где он фактически находит Foo_id.Моя проблема в том, что я не могу найти способ определить это с помощью классов.

У меня есть поле в сущности "Bar", которое можно использовать как дискриминатор, если мне нужно это сделать,(Bar.IsFooSubclassA)

1 Ответ

1 голос
/ 12 мая 2011

Вы звоните KeyColumn("some_column_name"); в ваших SubclassMappings? Это необходимо, чтобы получить отображение таблицы на подкласс. Тогда ссылка от «Bar» на «Foo» - это просто References() вызов для многих к одному или HasOne() для одного к одному.

Следующее может не относиться к вашему вопросу, но я напишу его для полноты:

Если ваше отображение правильное, вы можете получить правильную сущность обратно, но просто не увидите ее. Вы должны знать, что полиморфная загрузка «многие к одному» или «один к одному» с отложенной загрузкой всегда будет прокси-сервером базового класса («Foo»), потому что NHibernate не может знать, какой подкласс будет там, когда прокси создано. По этой причине вы не можете просто проверить тип с помощью оператора «is» (или аналогичного).

Если вы не используете отложенную загрузку или активно извлекаете ассоциацию, когда загружаете "Bar", вы должны получить "нормальный" объект "FooSubclassA" или "FooSubclassB".

Если вам нужна ленивая загрузка, вы можете обойти это здесь: http://sessionfactory.blogspot.com/2010/08/hacking-lazy-loaded-inheritance.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...