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