Могу ли я использовать назначенный идентификатор натурального ключа, все еще позволяя Nibernate для идентификации преходящих экземпляров?

StackOverflow https://stackoverflow.com/questions/3103964

Вопрос

Объект 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 и, возможно, самого стола, так как он не служит цели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top