当我使用SchemaExport工具与SQL Server 2005,它会产生像独特的键名:NHibernate的SchemaExport:如何生成一个有意义的唯一键名称?
UQ__Employees__03317E3D
我怎样才能产生这样一个名字:UQ__Employees__Name? 即使在SQL Server中!
当我使用SchemaExport工具与SQL Server 2005,它会产生像独特的键名:NHibernate的SchemaExport:如何生成一个有意义的唯一键名称?
UQ__Employees__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的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。辅助数据库对象
这解释了您需要执行的操作。
目前(仍然)不是在NHibernate中本地执行此操作的方法。我已经浏览了问题跟踪系统,发现一个在2.0版本中打开并且从未修复过的问题。我已经提前下载了NHibernate的源代码,并且很容易解决这个问题。建立这个项目并不是最简单的,但一旦你得到它,这并不是那么糟糕。我会在这里发布代码snippit,但它有点大,所以如果你想让它知道。
为什么不创建与原始问题关联的拉请求? – 2012-06-09 23:41:28
迭戈,我使用的是3.1版,当前版本是3.3,所以可能会有问题。另外,我对GitHub并不是很熟悉,那会是正确的行动方式吗? – Michael 2012-06-11 21:48:09
从那时起,很可能与此相关的代码段并没有太大的改变(或根本没有改变)。另外,你可以在Github上学习一些有趣的知识并提出请求:-)或者,你可以在原始问题或开发列表中发布代码更改(如果可能的话,使用单元测试)。 – 2012-06-11 21:55:14
做的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
第一种方式是行不通的。 当前,唯一键的指定值不用于命名约束,仅用于对映射文件中的列进行分组。 我会尝试“命名策略”的方式。 – ldp615 2010-09-03 03:01:15
而且“NamingStrategy”方法也无法工作。 NHibernate.Cfg.INamingStrategy只关心表名和列名。 – ldp615 2010-09-03 03:14:06
对不起。我会检查是否有任何其他方式来完成你以后的事情。 – 2010-09-03 03:37:37