Nhibernate: один ко многим, основанный на нескольких ключах? - PullRequest
1 голос
/ 17 сентября 2009

Предположим, у меня есть две таблицы

Table tA
    ID
    ID2
    SomeColumns
Table tB
   ID
   ID2
   SomeOtherColumns

Я ищу создать объект, назовем его ObjectA (на основе tA), который будет иметь отношение один-ко-многим к ObjectB (на основе tB). Однако в моем примере мне нужно использовать комбинацию ID и ID2 в качестве внешнего ключа. Если бы я писал SQL, он бы выглядел так:

выберите ТБ. * от ТА, ТБ где tA.ID = tB.ID и tA.ID2 = tB.ID2;

Я знаю, что для каждой комбинации ID / ID2 в tA у меня должно быть много строк поэтому я знаю, что это комбинация один ко многим. Очевидно, что нижеприведенного набора недостаточно для такого сопоставления, поскольку он учитывает только один ключ.

<set name="A2" table="A2" generic="true" inverse="true" >
  <key column="ID" />
  <one-to-many class="A2" />
</set>

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 октября 2009

Вы пробовали это?

<set name="A2" table="A2" generic="true" inverse="true" >
  <key>
    <column ="ID" />
    <column ="ID2" />
  </key>
  <one-to-many class="A2" />
</set>
0 голосов
/ 02 ноября 2009

Для меня это звучит так, как будто вы ошибаетесь. Предлагаемая структура таблиц явно нарушает принцип нормализации для отношений базы данных. Если комбинация ID / ID2 в таблице tA имеет много связанных записей в tB, то у вас должен быть суррогатный первичный ключ в tA, на который будет ссылаться из tB (и, следовательно, tB вообще не будет иметь Id, столбец ID2).

Как только ваша таблица нормализуется, как я уже говорил ранее, отображение nhibernate так же просто, как сопоставление множества «один к одному» в EntityA или сопоставление набора «один ко многим» в EntityB (в зависимости от направления отношений между этими двумя объектами в домене). В конце концов, это домен, а не структура БД, который управляет им.

0 голосов
/ 06 октября 2009

Я ищу решение этой точно такой же проблемы. Кажется, что отношения «один ко многим» могут иметь только один столбец, указанный в отображении. Должен быть какой-то способ обойти это ...

...