我们开始在我的工作场所使用NHibernate,包括从映射生成模式。我们的DBA需要的一件事是主键和外键关系的一致名称。我已经能够设置FK约束名称,但查看<id>
的文档,看起来好像没有办法命名主键约束。 http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-idNHibernate - 名称主键约束?
我想我错过了一些东西,因为这看起来像是一件非常基本的事情。
我们开始在我的工作场所使用NHibernate,包括从映射生成模式。我们的DBA需要的一件事是主键和外键关系的一致名称。我已经能够设置FK约束名称,但查看<id>
的文档,看起来好像没有办法命名主键约束。 http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-idNHibernate - 名称主键约束?
我想我错过了一些东西,因为这看起来像是一件非常基本的事情。
不幸的是它不被支持。这是一个ugly workaround。
在生成模式以修复主键名称后,我运行以下脚本。用您的数据库名称替换$(targetDb)
。
BEGIN TRANSACTION
DECLARE @Rename nvarchar(MAX)
DECLARE RenameCursor CURSOR FOR
SELECT
'EXEC sp_rename ''[' + c.CONSTRAINT_SCHEMA + '].[' + c.CONSTRAINT_NAME + ']'', ''PK_' + c.TABLE_NAME + ''', ''OBJECT'''
FROM $(targetDb).INFORMATION_SCHEMA.TABLE_CONSTRAINTS c
WHERE
c.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND
c.TABLE_NAME IS NOT NULL
ORDER BY c.TABLE_NAME
OPEN RenameCursor
FETCH NEXT
FROM RenameCursor
INTO @Rename
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @Rename
FETCH NEXT
FROM RenameCursor
INTO @Rename
END
CLOSE RenameCursor
DEALLOCATE RenameCursor
COMMIT TRANSACTION
从http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express,这里是一个解决办法:
NHibernate的不提供(还)的设施,以提供一个名称的 主键(但是没有,我发现,我承认我不是一个 NHibernate的大师,但普通用户)。您可以使用类似 的方法,这与我以前的文章中提到的方法类似。
在这个例子中,我使用SQL Server/SQL Express作为我的数据库引擎 ,并且考虑到了这些问题。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
<class name="SID.Sphera.Controls.Extended.ImageRegion.Entities.ImageSheetData, SID.Sphera.Controls.Extended"
table="ImageRegionImageSheetData" lazy="false">
<id name="_Id" access="field" column="IRISD_Id" type="guid">
<generator class="guid" />
</id>
<property name="_Name" access="field" column="IRISD_Name" type="string" not-null="true" />
<property name="_ResourceId" access="field" column="IRISD_ResourceId" type="guid" not-null="true" />
<property name="_Width" access="field" column="IRISD_Width" not-null="true" type="int" />
<property name="_Height" access="field" column="IRISD_Height" not-null="true" type="int" />
<property name="_BackgroundImageId" access="field" column="IRISD_BackgroundImageId" type="guid"
not-null="false" />
<bag name="_sensitiveRegions" access="field" cascade="all-delete-orphan" lazy="false">
<key column="IRIRD_ParentImageSheetId" foreign-key="FK_IRIRD_IRISD" />
<one-to-many class="SID.Sphera.Controls.Extended.ImageRegion.Entities.ImageRegionData, SID.Sphera.Controls.Extended" />
</bag>
</class>
<!-- Primary Key Rename -->
<database-object>
<create>
DECLARE @pkName Varchar(255)
;
SET @pkName= (
SELECT [name] FROM sysobjects
WHERE [xtype] = 'PK'
AND [parent_obj] = OBJECT_ID(N'[dbo].[ImageRegionImageSheetData]')
)
;
Exec sp_rename @pkName, 'PK_ImageRegionImageSheetData', 'OBJECT'
</create>
<drop/>
</database-object>
</hibernate-mapping>
有了这个查询你的主键这是由NHibernate的产生 的实际名称,这是特定于SQL Server/SQL表达 ,并使用你有不同的数据库引擎以适应那些 查询(我知道你放弃了NHibernate提供的数据库引擎 的解耦,但是你可以设置一些策略来根据你当前的方言加载 不同的映射)。
我们使用系统存储过程,允许我们重命名我们之前获得的对象 。
嗯,希望它会很快加入。我们使用Fluent,所以我们可能会创建一个单独的脚本来运行后期模式创建。感谢您的链接! – Andy 2010-07-07 15:37:15
现在链接已损坏。另一个糟糕的StackOverflow评论的例子。 – 2017-04-26 10:25:26
@FrancoisBotha对于2010年以来的这个答案,我不满意你的期望表示抱歉。然而,一些光线搜索使我得出结论,这个不被支持的主要观点仍然有效。 – 2017-04-26 11:19:41