NHibernate - Имя Ограничение первичного ключа? - PullRequest
6 голосов
/ 07 июля 2010

Мы начинаем использовать NHibernate на моем рабочем месте, включая создание схемы из сопоставлений. Одна вещь, которую хотят наши администраторы базы данных - это согласованные имена для отношений первичного и внешнего ключей. Я смог установить имя ограничения FK, но, глядя на документацию для <id>, не похоже, что есть способ назвать ограничение первичного ключа. http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id

Я предполагаю, что что-то упустил, так как это кажется довольно простой вещью.

Ответы [ 3 ]

5 голосов
/ 07 июля 2010

К сожалению, это не поддерживается. Вот уродливый обходной путь .

4 голосов
/ 20 июня 2012

После запуска схемы я запускаю следующий скрипт, чтобы исправить имена первичных ключей.Замените $(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
1 голос
/ 26 апреля 2017

С 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 / SQL Express и вы используете другой движок базы данных, вы должны адаптировать эти запросы (я знаю, что вы потеряете развязку с движком базы данных предлагается NHibernate, но вы можете настроить некоторые стратегии для загрузки различные отображения в соответствии с вашим текущим диалектом).

Мы используем системную хранимую процедуру, которая позволяет нам переименовывать объект, который мы получили раньше.

...