2010-07-07 226 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提供的数据库引擎 的解耦,但是你可以设置一些策略来根据你当前的方言加载 不同的映射)。

我们使用系统存储过程,允许我们重命名我们之前获得的对象 。