NHibernate - Отображение внешнего ключа строки

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

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

Привет, у нас та же проблема. Вы нашли решение?

fredrik 17.04.2009 17:51

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

Mr Plough 18.04.2009 14:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
12 241
4

Ответы 4

Я не уверен на 100%, что это сработает, но пробовали ли вы сопоставление "многие-к-одному"?

Может быть, примерно так:

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

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

Я попробовал, но получил ошибку: найдено несколько строк с данным идентификатором: Arsenal, для класса: DataTransfer.Player. Я должен был упомянуть, что я картирую отношения Команда -> Игрок, а не наоборот - я обновил свой исходный вопрос.

Mr Plough 20.01.2009 21:59

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

При этом я получаю немного другую ошибку: Несоответствие типа идентификатора; Найдено: <System.Int32> Ожидается: <System.String>

Mr Plough 20.01.2009 22:03

Я думаю, что для решения этой проблемы существует атрибут 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 только к ключевому тегу, к сожалению, тоже не работает.

Mr Plough 21.01.2009 02:29

Достаточно иметь ссылку на свойство в "ключе". Никакой необходимости иметь его в режиме многие-ко-многим не требуется.

Illuminati 30.06.2011 13:31

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

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

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

Другие вопросы по теме