我们开始在我的工作场所使用NHibernate,包括从映射生成模式。我们的DBA想要的一件事是主键和外键关系的一致名称。我已经能够设置FK约束名称,但是查看<id>
的文档,看起来没有办法命名主键约束。 http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id
我认为我错过了一些东西,因为这似乎是一件非常基本的事情。
答案 0 :(得分:5)
不幸的是,它不受支持。这是一个ugly workaround。
答案 1 :(得分:4)
生成架构后,我运行以下脚本来修复主键名称。将$(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
答案 2 :(得分:1)
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 express 你是否使用不同的数据库引擎来调整它们 查询(我知道你放松了与数据库引擎的分离 由NHibernate提供,但您可以设置一些加载策略 根据你当前的方言不同的映射。)
我们使用允许我们重命名的系统存储过程 我们之前得到的对象。