Унаследованная мной устаревшая база данных содержит следующие таблицы:
Teams (
TeamId INT PRIMARY KEY,
Name VARCHAR(30)
)
Players (
PlayerId INT PRIMARY KEY,
Team VARCHAR(30)
)
Внешний ключ в таблице игроков относится к названию команды, а не к teamId.
Я попытался сопоставить команду с игроками с помощью сумки:
<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
Я закончил тем, что просто создал новый столбец типа int для внешнего ключа и использовал его вместо этого, так и не смог заставить работать внешний строковый ключ.





Я не уверен на 100%, что это сработает, но пробовали ли вы сопоставление "многие-к-одному"?
Может быть, примерно так:
<many-to-one name = "Players" class = "DataTransfer.Player, DataTransfer"
column = "Name" property-ref = "Team" />
Я считаю, что это должно сработать, согласно руководству NHibernate, свойство-ref - это атрибут, который используется для сопоставления устаревших данных, где внешний ключ относится к уникальному ключу связанной таблицы, отличному от первичного ключа. Это похоже на ситуацию, в которой вы оказались.
Я попробовал, но получил ошибку: найдено несколько строк с данным идентификатором: Arsenal, для класса: DataTransfer.Player. Я должен был упомянуть, что я картирую отношения Команда -> Игрок, а не наоборот - я обновил свой исходный вопрос.
Я считаю, что вам нужно будет использовать атрибут property-ref для определения поля, с которым вы будете связываться. Атрибут внешнего ключа используется для генерации DDL для создания отношений (если вы используете эту функцию).
При этом я получаю немного другую ошибку: Несоответствие типа идентификатора; Найдено: <System.Int32> Ожидается: <System.String>
Я думаю, что для решения этой проблемы существует атрибут property-ref.
<bag name = "Players">
<key column = "Team" property-ref = "Team" />
<one-to-many class = "Player" property-ref = "Team" />
</bag>
Похоже, NHibernate не поддерживает атрибут property-ref в теге «один ко многим», и добавление property-ref только к ключевому тегу, к сожалению, тоже не работает.
Достаточно иметь ссылку на свойство в "ключе". Никакой необходимости иметь его в режиме многие-ко-многим не требуется.
Только что нашел это: https://nhibernate.jira.com/browse/NH-1272, кажется, это ошибка в NHibernate, и она исправлена в 2.1.0Alpha1.
Я пробовал это в NHibernate 2.1.0Alpha2, и он работает!
(ссылка на свойство должна быть только в теге карты)
Привет, у нас та же проблема. Вы нашли решение?