2010-07-07 1 views
6

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

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

ответ

5

Не поддерживается, к сожалению. Вот ugly workaround.

+0

Хм, надеюсь, он будет добавлен в ближайшее время. Мы используем Fluent, поэтому мы, возможно, просто создадим отдельный скрипт, который мы запускаем после создания схемы. Спасибо за ссылку! – Andy

+0

Ссылка была разбита. Другой пример плохого комментария StackOverflow. –

+0

@FrancoisBotha Приносим извинения за невыполнение ваших ожиданий с помощью этого ответа с 2010 года. Тем не менее, некоторый легкий поиск приводит меня к выводу, что основной момент, что это не поддерживается, остается в силе. –

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^