Могу ли я использовать назначенный идентификатор натурального ключа, все еще позволяя Nibernate для идентификации преходящих экземпляров?
-
29-09-2019 - |
Вопрос
Объект A
имеет ассоциацию «один ко многим»: многие объекты B
.
Когда я смотрю в базу данных - TableB
- Я хотел бы увидеть уникальную, читаемую строку A.Name
Вместо того, чтобы всегда присоединиться или подбирать на суррогатном целочисленном идентификаторе, чтобы увидеть имя.
Я могу карту Name
как идентификатор для A
, но это вызывает много дополнительных SELECT
Запросы, потому что nhibernate не может определить, является ли экземпляр A
является временным или постоянным.
Я полагаю, что я мог бы использовать композитный ключ, сочетая суррогатный клавишу с естественным ключом с естественным ключом. Это кажется неоптимальным, но я бы хотел услышать некоторые мнения.
Я действительно ищу стратегию использования единого колонкового натурального ключа, позволяя Nhibernate идентифицировать переходные экземпляры.
- Является ли это возможным?
- Что такое сопоставление - свободно или в HBM?
С другой стороны, если это все ужасная идея, и я должен просто полагаться на просмотры базы данных с подсессивами, пожалуйста, объясните.
Спасибо.
Решение
Это ужасная идея, и вы должны создать представление, которое делает присоединение к тем разам, когда вам нужно «смотреть в базу данных».
Это ужасная идея, потому что имя не является основным ключом таблицы A.
Но я думаю, что вы можете сделать это, если вы поставите уникальное ограничение на A.Name и сопоставьте его как идентификатор. Я не уверен, если Nibernate по умолчанию на нуле или пустую строку для несогласованного значения, но вы можете указать его, используя
Id(x => x.Name).GeneratedBy.Assigned().UnsavedValue(string.Empty); // or null
Если вы используете string.empty, чем конструктор A, должен инициализировать имя в string.empty. Я также удалил бы суррогатный идентификатор из A и, возможно, самого стола, так как он не служит цели.