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

Объект A имеет связь один ко многим: много объектов B,

Когда я смотрю в базу данных - TableB - Я хотел бы видеть уникальную, читаемую строку A.Name вместо того, чтобы всегда присоединяться или выбирать на суррогатном целочисленном идентификаторе, чтобы увидеть имя.

Я могу карту Name в качестве идентификатора для A, но это вызывает много лишнего SELECT запросы, потому что NHibernate не может определить, является ли экземпляр A является временным или постоянным.

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

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

  • Является ли это возможным?
  • Что такое отображение - бегло или хбм?

С другой стороны, если это все ужасная идея, и я должен просто полагаться на представления базы данных с подвыборками, пожалуйста, объясните.

Благодарю.

1 ответ

Решение

Это ужасная идея, и вы должны создать представление, которое выполняет объединение в тех случаях, когда вам нужно "искать в базе данных".

Это ужасная идея, потому что Имя не является первичным ключом таблицы А.

Но я думаю, что вы можете сделать это, если наложите уникальное ограничение на A.Name и отобразите его как идентификатор. Я не уверен, что по умолчанию NHibernate имеет значение NULL или пустую строку для несохраненного значения, но вы можете указать его, используя

Id(x => x.Name).GeneratedBy.Assigned().UnsavedValue(string.Empty); // or null

Если вы используете string.Empty, то конструктор A должен инициализировать Name в string.Empty. Я также удалил бы суррогатный идентификатор из A и, возможно, саму таблицу, поскольку она не имеет смысла.

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