NHibernate SchemaExport:如何生成有意义的唯一键名?

ldp*_*615 5 nhibernate schemaexport

当我将SchemaExport与SQL Server 2005一起使用时,它会生成唯一的密钥名称,如:

UQ__Employees__03317E3D

如何生成如下名称:UQ__Employees__Name?即使在SQL Server中!

Nat*_*her 3

我认为有几种方法可以实现您想要做的事情。

第一个是在映射文件中指定名称。我知道它适用于外键,尽管我还没有尝试过使用唯一键。

<property name="KeyId" column="KeyId" type="Int" unique="true" unique-key="MyKeyName"/>
Run Code Online (Sandbox Code Playgroud)

在 NHibernate 中,您可以通过创建一个实现的类来更改命名策略NHibernate.Cfg.INamingStrategy,并在配置 nhibernate 时添加该类。

ISessionFactory sf = new Configuration()  
     .SetNamingStrategy(new YourNamingStrategy())  
     .Configure()  
     .SchemaExport(true, false);
Run Code Online (Sandbox Code Playgroud)

这也是一个内置于 nhibernate 的改进命名策略 (ImprovedNamingStrategy)。不记得它立即输出什么,但值得一试

ISessionFactory sf = new Configuration()
    .SetNamingStrategy(ImprovedNamingStrategy.Instance)
    .Configure()
    .SchemaExport(true, false);
Run Code Online (Sandbox Code Playgroud)

编辑
我发现还有其他几种可能性,第一个涉及属性标签。有一个列标签,其中有许多可能有用的属性。

<property name=KeyID>
  <column name="KeyId" unique-key="MyKeyName"/>
</property>
Run Code Online (Sandbox Code Playgroud)

另一个涉及更多一点你可以添加这样的东西

<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>
Run Code Online (Sandbox Code Playgroud)

NHibernate.Mapping.IAuxiliaryDatabaseObject或者创建一个实现将创建 DDL 语句的类。
查看nhibernate.info 上的 Niberate 手册并向下滚动到

5.6. 辅助数据库对象

这解释了您需要做什么。