2010-07-07 162 views

回答

5

不幸的是它不被支持。這是一個ugly workaround

+0

嗯,希望它會很快加入。我們使用Fluent,所以我們可能會創建一個單獨的腳本來運行後期模式創建。感謝您的鏈接! – Andy 2010-07-07 15:37:15

+0

現在鏈接已損壞。另一個糟糕的StackOverflow評論的例子。 – 2017-04-26 10:25:26

+0

@FrancoisBotha對於2010年以來的這個答案,我不滿意你的期望表示抱歉。然而,一些光線搜索使我得出結論,這個不被支持的主要觀點仍然有效。 – 2017-04-26 11:19:41

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 
0

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提供的數據庫引擎 的解耦,但是你可以設置一些策略來根據你當前的方言加載 不同的映射)。

我們使用系統存儲過程,允許我們重命名我們之前獲得的對象 。