NHibernate-名称主键约束?

NHibernate-名称主键约束?,nhibernate,primary-key,constraints,Nhibernate,Primary Key,Constraints,我们开始在我的工作场所使用NHibernate,包括从映射生成模式。DBA希望主键和外键关系的名称保持一致。我已经能够设置FK约束的名称,但是查看文档,似乎没有办法命名主键约束 我想我错过了一些东西,因为这似乎是一件非常基本的事情。不幸的是,它不受支持。下面是一个。在生成模式后,我运行以下脚本来修复主键名称。将$targetDb替换为您的数据库名称 开始交易 声明@Rename nvarcharMAX 声明的重命名或游标 选择 'EXEC sp_rename['+c.CONSTRAINT_SCH

我们开始在我的工作场所使用NHibernate,包括从映射生成模式。DBA希望主键和外键关系的名称保持一致。我已经能够设置FK约束的名称,但是查看文档,似乎没有办法命名主键约束


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

不幸的是,它不受支持。下面是一个。

在生成模式后,我运行以下脚本来修复主键名称。将$targetDb替换为您的数据库名称

开始交易 声明@Rename nvarcharMAX 声明的重命名或游标 选择 'EXEC sp_rename['+c.CONSTRAINT_SCHEMA+'.['+c.CONSTRAINT_NAME+'],PK_'+c.TABLE_NAME+',OBJECT' 来自$targetDb.INFORMATION_SCHEMA.TABLE_约束条件c 哪里 c、 约束类型='主键' 和 c、 表名称不为空 按c.表格名称排序 打开重命名器 接下一个 来自重命名器 进入@Rename 而@@FETCH\u STATUS=0 开始 EXEC sp_executesql@Rename 接下一个 来自重命名器 进入@Rename 终止 关闭重命名器 取消分配重命名器 提交事务 从中,这里有一个解决方法:

NHibernate还没有提供一个设施来为您的客户命名 主键我什么也没找到不过我承认我不是 NHibernate大师,但一般用户。您可以使用类似的方法 我在上一篇文章中揭露了这一点

在本例中,我使用SQL Server/SQL Express作为数据库引擎 而查询就是基于这一点构建的

通过此查询,您可以获得所访问的主键的实际名称 由NHibernate生成,特定于SQL server/SQL express 如果您使用不同的数据库引擎,则必须对其进行调整 查询我知道您失去了与数据库引擎的解耦 由NHibernate提供,但您可以设置一些加载策略 根据您当前的方言进行不同的映射

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


嗯,希望很快就能添加。我们使用的是Fluent,所以我们可能只需要创建一个单独的脚本,然后再运行模式创建。谢谢你的链接!链接现在已断开。另一个糟糕的StackOverflow评论的例子。@FrancoisBotha我很抱歉,从2010年起,这个答案没有达到您的期望。尽管如此,通过一些简单的研究,我得出结论,认为这一点不受支持的主要观点仍然有效。
<?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>