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

时间:2010-09-03 01:10:11

标签: nhibernate schemaexport

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

UQ__Employees__03317E3D

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

3 个答案:

答案 0 :(得分:3)

我认为有几种方法可以做你想做的事。

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

<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);

这也是一个内置于nhibernate的ImprovedNamingStrategy。不记得它输出的是什么,但值得一试

ISessionFactory sf = new Configuration()
    .SetNamingStrategy(ImprovedNamingStrategy.Instance)
    .Configure()
    .SchemaExport(true, false);

修改
我发现还有其他几种可能性 第一个涉及属性标记。有一个列标记,其中包含许多可能有用的属性。

<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 manual on nhibernate.info并向下滚动到

  

5.6。辅助数据库对象

这解释了你需要做什么。

答案 1 :(得分:1)

目前还有(仍)没有办法在NHibernate中本地执行此操作。我已经完成了问题跟踪系统,发现了一个在2.0中打开并且从未修复过的问题。我已经继续下载NHibernate的源代码,并且很容易解决这个问题。建立项目并不是最简单的,但一旦你得到它,它就不那么糟糕了。我在这里发布了代码snippit,但它有点大,所以如果你想要它让我知道。

答案 2 :(得分:0)

在执行SchemaExport之后,您可以根据它们所在的表的名称重命名所有PK:

DECLARE @PKname nvarchar(255), @TName nvarchar(255), @TName2 nvarchar(258) DECLARE PKCursor CURSOR FOR SELECT PK.name, T.name AS Tname FROM sys.sysobjects AS PK INNER JOIN sys.sysobjects AS T ON PK.parent_obj = T.id WHERE (PK.xtype = 'PK') OPEN PKCursor FETCH NEXT FROM PKCursor INTO @PKname, @TName WHILE @@FETCH_STATUS = 0 BEGIN SET @TName2 = 'PK_' + @TName PRINT 'table ' + @TName + ' : renaming ' + @PKname + ' in ' + @TName2 Exec sp_rename @PKname, @TName2, 'OBJECT' FETCH NEXT FROM PKCursor INTO @PKname, @TName END CLOSE PKCursor DEALLOCATE PKCursor

多年前在http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express

看到它