当我将 SchemaExport 与 SQL Server 2005 一起使用时,它会生成唯一的键名,例如:
UQ__员工__03317E3D
如何生成一个名称,如:UQ__Employees__Name?即使在 SQL Server 中!
当我将 SchemaExport 与 SQL Server 2005 一起使用时,它会生成唯一的键名,例如:
UQ__员工__03317E3D
如何生成一个名称,如:UQ__Employees__Name?即使在 SQL Server 中!
我认为有几种方法可以做你想做的事情。
第一个是在映射文件中指定名称。我知道它适用于外键,尽管我没有尝试过使用唯一键。
<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 内置的改进命名策略。不记得它输出了什么,但值得一试
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 语句的类。
查看 nhibernate.info 上的NHirate 手册并向下滚动到
5.6. 辅助数据库对象
这解释了您需要做什么。
目前(仍然)没有一种方法可以在 NHibernate 中本地执行此操作。我浏览了问题跟踪系统,发现了一个在 2.0 中打开但从未修复的问题。我已经下载了 NHibernate 的源代码,并且很容易解决这个问题。构建项目并不是最简单的,但一旦你得到它,它并没有那么糟糕。我会在这里发布代码片段,但它有点大,所以如果你想要它让我知道。
在执行 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看到它