Как создать индекс нескольких столбцов или уникальное ограничение с помощью NHibernate
Как создать индекс нескольких столбцов и/или уникальное ограничение с использованием NHibernate Mapping или Fluent NHibernate.
Ответы
Ответ 1
присвоить имя индекса/уникального ограничения более чем одному свойству
<property name="A" index="AB" />
<property name="B" index="AB" />
Теоретически он также будет работать с наличием более одного индекса для одного и того же объекта:
<property name="A" index="AB, ABC" />
<property name="B" index="AB, ABC" />
<property name="C" index="ABC" />
Но есть ошибка. Я также написал патч. Если вы заинтересованы в этом, проголосуйте за ошибку или добавьте комментарий или что-то еще.
Изменить: только что проверили, что случилось с ошибка. Он исправлен в версии 2.1.0, поэтому он должен отлично работать сейчас. Большое спасибо большой команде разработчиков NHibernate!
Ответ 2
Старый, но мне есть, что добавить, поскольку я столкнулся с этой же проблемой:
Stefan Steinegger правильно ответил на неспецифические многоколоночные индексы, но оставил код для уникальных многоколоночных индексов. Для тех, кого вы можете использовать:
<property name="A" unique-key="AB" />
<property name="B" unique-key="AB" />
Итак, по существу то же самое, но с другим именем атрибута.
Интересно отметить, что для уникальных индексов NHibernate генерирует собственное имя для ключа, но для неидеальных индексов он использует все, что вы ему даете.
Например, приведенный выше код НЕ будет генерировать уникальный индекс с именем "AB", а скорее как UQ__TableName__7944C87104A02EF4
.
Это описано в в разделе 19.1.1 документации NHibernate:
Некоторые теги принимают атрибут index
для указания имени индекс для этого столбца. Атрибут unique-key
может использоваться для группировки столбцов в одном ключевом ограничении. В настоящее время указанные значение атрибута unique-key не используется для обозначения ограничения, только для группировки столбцов в файле сопоставления.
Однако следующее:
<property name="A" index="AB" />
<property name="B" index="AB" />
будет просто генерировать индекс с именем "AB".