NHibernate SchemaExport: Как создать значимое уникальное имя ключа? - PullRequest
5 голосов
/ 03 сентября 2010

Когда я использую SchemaExport с SQL Server 2005, он генерирует уникальные имена ключей, такие как:

UQ__Employees__03317E3D

Как я могу сгенерировать имя типа: UQ__Employees__Name?Даже в SQL Server!

Ответы [ 3 ]

3 голосов
/ 03 сентября 2010

Я думаю, что есть пара способов сделать то, что вы пытаетесь сделать.

Первый - указать имя в файле сопоставления. Я знаю, что это работает для внешних ключей, хотя я не пробовал с уникальными ключами.

<property name="KeyId" column="KeyId" type="Int" unique="true" unique-key="MyKeyName"/>

В NHibernate вы можете изменить стратегию именования, создав класс, реализующий NHibernate.Cfg.INamingStrategy, и добавив этот класс при настройке nhibernate.

ISessionFactory sf = new Configuration()  
     .SetNamingStrategy(new YourNamingStrategy())  
     .Configure()  
     .SchemaExport(true, false);

Это также ImprovedNamingStrategy, которая встроена в nhibernate. Не могу вспомнить, что он выводит от руки, но стоит попробовать

ISessionFactory sf = new Configuration()
    .SetNamingStrategy(ImprovedNamingStrategy.Instance)
    .Configure()
    .SchemaExport(true, false);

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

<property name=KeyID>
  <column name="KeyId" unique-key="MyKeyName"/>
</property>

другой немного сложнее Вы можете добавить что-то вроде этого

<database-object >
   <create>
      create table MyTable(
      Id UNIQUEIDENTIFIER not null,
      Name NVARCHAR(10) not null,
      RowVersion INT not null,

      primary key (Id)
      )

ALTER TABLE dbo.MyTable ADD  
  CONSTRAINT IX_Table_1 UNIQUE NONCLUSTERED(Name) 
  WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    </create>
    <drop></drop>
</database-object>

Или создайте класс, который реализует NHibernate.Mapping.IAuxiliaryDatabaseObject, который будет создавать операторы DDL.
Загляните в руководство NHiberate на nhibernate.info и прокрутите вниз до

5,6. Вспомогательные объекты базы данных

Это объясняет, что вам нужно делать.

1 голос
/ 09 июня 2012

В настоящее время в NHibernate нет способа сделать это изначально.Я прошел через систему отслеживания ошибок и обнаружил проблему, которая была открыта в 2.0 и никогда не была исправлена.Я скачал исходник для NHibernate и легко смог решить эту проблему.Построить проект не просто, но как только вы его получите, это не так уж плохо.Я бы выложил здесь фрагмент кода, но он для этого немного велик, поэтому, если хотите, дайте мне знать.

0 голосов
/ 12 июля 2014

После выполнения SchemaExport вы можете переименовать все PK в соответствии с именем таблицы, в которой они находятся:

DECLARE @PKname nvarchar(255), @TName nvarchar(255), @TName2 nvarchar(258) DECLARE PKCursor CURSOR FOR SELECT PK.name, T.name AS Tname FROM sys.sysobjects AS PK INNER JOIN sys.sysobjects AS T ON PK.parent_obj = T.id WHERE (PK.xtype = 'PK') OPEN PKCursor FETCH NEXT FROM PKCursor INTO @PKname, @TName WHILE @@FETCH_STATUS = 0 BEGIN SET @TName2 = 'PK_' + @TName PRINT 'table ' + @TName + ' : renaming ' + @PKname + ' in ' + @TName2 Exec sp_rename @PKname, @TName2, 'OBJECT' FETCH NEXT FROM PKCursor INTO @PKname, @TName END CLOSE PKCursor DEALLOCATE PKCursor

Видел это лет назад в: http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express

...