NHibernate - сопоставление внешнего ключа строки - PullRequest
4 голосов
/ 20 января 2009

Унаследованная база данных, которую я унаследовал, содержит следующие таблицы:

Teams ( 
 TeamId INT PRIMARY KEY,
 Name VARCHAR(30)
)

Players (
 PlayerId INT PRIMARY KEY,
 Team VARCHAR(30)
)

Внешний ключ в таблице игроков относится к названию команды, а не к идентификатору команды.

Я попытался сопоставить команду с игроками, используя сумку:

<bag name="Players">
    <key column="Team" foreign-key="Name" />
    <one-to-many class="DataTransfer.Player, DataTransfer" />
</bag>

Но я получаю SqlException: Ошибка преобразования при преобразовании значения varchar 'Arsenal' в тип данных int

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

Редактировать: я использую NHibernate 2.0.1

Ответы [ 4 ]

3 голосов
/ 20 января 2009

Я думаю, что атрибут property-ref существует для решения этой проблемы.

<bag name="Players">
   <key column="Team" property-ref="Team" />
   <one-to-many class="Player" property-ref="Team" />
</bag>
3 голосов
/ 20 января 2009

Теперь я не уверен на 100%, сработает ли это, но вы пробовали сопоставление «многие к одному»?

Может быть, что-то вроде этого:

<many-to-one name="Players" class="DataTransfer.Player, DataTransfer"
             column="Name" property-ref="Team" />

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

0 голосов
/ 20 апреля 2009

Только что нашел: https://nhibernate.jira.com/browse/NH-1272, кажется, что это ошибка в NHibernate, и она исправлена ​​в 2.1.0Alpha1.

Я попробовал его в NHibernate 2.1.0Alpha2, и он работает!

(свойство-ref должно быть только в теге карты)

0 голосов
/ 20 января 2009

Я считаю, что вам нужно будет использовать атрибут property-ref, чтобы определить поле, с которым вы будете ассоциироваться. Атрибут внешнего ключа используется для генерации DDL для создания отношений (если вы используете эту функцию).

...