Однозначное сопоставление NHibernate, непервичные ключи

Не удается заставить NHibernate сгенерировать правильный запрос. Он продолжает использовать первичные ключи двух таблиц, к которым я присоединяюсь, для однозначного отношения, и я не могу понять, как указать внешний ключ в одной из таблиц.

tableA      tableB
{ aID,      { bID,
  bID,        z,
  c,          y,
  d }         x }

поэтому tableA должен присоединиться к tableB, используя tableA.bID = tableB.bID. Как я могу указать это в сопоставлении для tableA? Я использую класс tableA для извлечения строки из tableA и строки из tableB, поскольку это реальная связь один к одному.

NHibernate генерирует sql для соединения таблиц, используя tableA.aID = tableB.bID, что неверно.

Это не работает:

<class name="tableA" table="tableA">
  <id name="aID" column="aID" />
  <property name="bID" column="bID" />
  <property name="c" column="c" />
  <property name="d" column="d" />
  <one-to-one name="otherThing" class="tableB" foreign-key="bID" />
</class>

<class name="tableB" table="tableB">
  <id name="bID" column="bID" />
  <property name="z" column="z" />
  <property name="y" column="y" />
  <property name="x" column="x" />
</class>

person MonkeyWrench    schedule 06.10.2010    source источник


Ответы (2)


Это правильный способ сопоставить его:

<class name="tableA" table="tableA">
  ...
  <many-to-one name="otherThing" class="tableB" column="bID" unique="true" />
</class>
  • Я предполагаю, что это действительно один к одному, поэтому unique.
  • Вы должны сопоставить каждый столбец ОДИН РАЗ. Если это отношение, то это не свойство типа int.

Ссылка из tableB в tableA будет реализована как:

<class name="tableB" table="tableB">
  ...
  <one-to-one name="A" class="tableA" property-ref="otherThing" />
</class>

Все это задокументировано в http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

person Diego Mijelshon    schedule 06.10.2010
comment
Спасибо. Это сработало. Смущает то, что мне приходится использовать элемент «многие к одному», когда на самом деле это сопоставление «один к одному». Я также установил тип выборки для соединения, чтобы уменьшить количество запросов. - person MonkeyWrench; 06.10.2010
comment
Но да, если вы можете показать двунаправленный пример, это было бы поучительно. - person MonkeyWrench; 06.10.2010

Вам не нужно указывать свойство как свойство в файле сопоставления, если вы также определяете однозначное отношение для одного и того же значения. Я не использовал индивидуальный подход, поэтому может возникнуть другая проблема, но я бы удалил строку:

<property name="bID" column="bID" /> 

из tableA и посмотрите, поможет ли это.

person Kendrick    schedule 06.10.2010
comment
Не имело никакого значения, и я не знаю, почему. В обеих таблицах есть этот столбец, и у обоих сопоставлений не должно быть проблем с этими свойствами. - person MonkeyWrench; 06.10.2010
comment
Стоит попробовать. Я обнаружил некоторые странные побочные эффекты от подобных вещей, поэтому решил выбросить их там. - person Kendrick; 06.10.2010