我們開始在我的工作場所使用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