NHibernate - 名称主键约束?

时间:2010-07-07 12:46:30

标签: nhibernate primary-key constraints

我们开始在我的工作场所使用NHibernate,包括从映射生成模式。我们的DBA想要的一件事是主键和外键关系的一致名称。我已经能够设置FK约束名称,但是查看<id>的文档,看起来没有办法命名主键约束。 http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id

我认为我错过了一些东西,因为这似乎是一件非常基本的事情。

3 个答案:

答案 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)

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 express   你是否使用不同的数据库引擎来调整它们   查询(我知道你放松了与数据库引擎的分离   由NHibernate提供,但您可以设置一些加载策略   根据你当前的方言不同的映射。)

     

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