Я думаю, что есть пара способов сделать то, что вы пытаетесь сделать.
Первый - указать имя в файле сопоставления. Я знаю, что это работает для внешних ключей, хотя я не пробовал с уникальными ключами.
<property name="KeyId" column="KeyId" type="Int" unique="true" unique-key="MyKeyName"/>
В NHibernate вы можете изменить стратегию именования, создав класс, реализующий NHibernate.Cfg.INamingStrategy
, и добавив этот класс при настройке nhibernate.
ISessionFactory sf = new Configuration()
.SetNamingStrategy(new YourNamingStrategy())
.Configure()
.SchemaExport(true, false);
Это также ImprovedNamingStrategy, которая встроена в nhibernate. Не могу вспомнить, что он выводит от руки, но стоит попробовать
ISessionFactory sf = new Configuration()
.SetNamingStrategy(ImprovedNamingStrategy.Instance)
.Configure()
.SchemaExport(true, false);
EDIT
Есть несколько других возможностей, которые я нашел
первый включает тег свойства. есть тег столбца, имеющий ряд атрибутов, которые могут быть полезны.
<property name=KeyID>
<column name="KeyId" unique-key="MyKeyName"/>
</property>
другой немного сложнее
Вы можете добавить что-то вроде этого
<database-object >
<create>
create table MyTable(
Id UNIQUEIDENTIFIER not null,
Name NVARCHAR(10) not null,
RowVersion INT not null,
primary key (Id)
)
ALTER TABLE dbo.MyTable ADD
CONSTRAINT IX_Table_1 UNIQUE NONCLUSTERED(Name)
WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
</create>
<drop></drop>
</database-object>
Или создайте класс, который реализует NHibernate.Mapping.IAuxiliaryDatabaseObject
, который будет создавать операторы DDL.
Загляните в руководство NHiberate на nhibernate.info и прокрутите вниз до
5,6. Вспомогательные объекты базы данных
Это объясняет, что вам нужно делать.