代码之家  ›  专栏  ›  技术社区  ›  Andy

nHibernate-名称主键约束?

  •  6
  • Andy  · 技术社区  · 14 年前

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

    我想我遗漏了一些事情,因为这似乎是一个非常基本的事情。

    3 回复  |  直到 7 年前
        1
  •  5
  •   Jamie Ide    14 年前

    不幸的是,它不受支持。这里有一个 ugly workaround .

        2
  •  4
  •   Schmalls    12 年前

    我在生成架构后运行以下脚本来修复主键名。替换 $(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
    
        3
  •  1
  •   Francois Botha    7 年前

    http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express ,这里有一个解决方法:

    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提供,但您可以设置一些策略来加载 根据您当前的方言不同的映射)。

    我们使用一个系统存储过程来重命名 我们以前得到的东西。