Дискриминатор на основе присоединенного свойства - PullRequest
1 голос
/ 29 апреля 2010

Предположим, у меня есть эти отношения:

abstract class Base { int Id; int JoinedId; ... }
class Joined { int Id; int Discriminator; ... }
class Sub1 : Base { ... }
class Sub2 : Base { ... }

для следующих таблиц:

table Base ( Id int, JoinedId int, ... )
table Joined ( Id int, Discriminator int, ... )

Я хотел бы настроить отображение наследования таблицы на иерархию для отношений Base, Sub1, Sub2, но используя свойство Disciminator из класса Joined в качестве дискриминатора.

Вот общая идея для файла сопоставления:

<class name="Base" table="Base">
    <id name="Id"><generator class="identity"/></id>

    <discriminator /> <!-- ??? or <join> or <many-to-one>? -->

    <subclass name="Sub1" discriminator-value="1">...</subclass>
    <subclass name="Sub2" discriminator-value="2">...</subclass>
</class>

Есть ли способ сделать что-то подобное с помощью <discriminator>, <join> или <many-to-one>? Кажется, NHiberante полагает, что дискриминатор - это столбец в данной таблице (для меня это имеет смысл. Я знаю, что это неортодоксально).

Спасибо.

Ответы [ 3 ]

3 голосов
/ 30 апреля 2010

Разве вы не можете использовать формулу дискриминатора с подвыбором на Joined?

<discriminator formula="(select j.discriminator from Joined j where j.id = joinedid)">
2 голосов
/ 27 апреля 2011

Я искал точно такую ​​же вещь и, увидев сообщение Диего, решил, что это невозможно, и продолжил поиск в Google, пытаясь найти альтернативы. Но после поиска проб и ошибок я обнаружил, что это точно такое же решение, опубликованное Meriton. Однако я столкнулся с оговорками (которые он объясняет, но не объясняет), что вы должны полностью квалифицировать свое поле на форуме, вы должны вернуть только одно поле и заключить свою формулу в скобки. Если вы оставите имя таблицы вне имени поля, оно будет предполагать, что это поле в текущей таблице, для которой предназначен запрос, и будет иметь префикс с чем-то вроде MyTable0_1., что нарушит ваш запрос. Круглые скобки необходимы для его отображения как вложенный оператор выбора. Использование формулы определит значение вашего поля дискриминатора для сравнения со значением дискриминатора в вашем подклассе. Когда я проверил отправляемый SQL-запрос, я обнаружил, что он, по сути, дал мне это ... (обратите внимание, мое поле распознавания было уникальным идентификатором)

....WHERE client0_.Id=@p0 and (SELECT ClientTypes.ClientClassId FROM ClientTypes WHERE ClientTypes.TypeId = client0_.TypeId)='f04c03db-d469-4c01-83c5-5a19c0aea264'

Надеюсь, что это поможет другим с этой проблемой.

0 голосов
/ 30 апреля 2010

Краткий ответ: это невозможно сделать, если вы не используете представление в качестве таблицы.

У меня была та же проблема в моем текущем проекте, и мне пришлось обходить ее, используя шаблон стратегии.

...