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

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

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

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

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

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

  • Возможно ли это?
  • Что такое отображение - свободно или hbm?

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

Спасибо.

1 Ответ

1 голос
/ 23 июня 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...