SQL Server 2005 で SchemaExport を使用すると、次のような一意のキー名が生成されます。
UQ__社員__03317E3D
UQ__Employees__Name のような名前を生成するにはどうすればよいですか? SQL Server でも!
SQL Server 2005 で SchemaExport を使用すると、次のような一意のキー名が生成されます。
UQ__社員__03317E3D
UQ__Employees__Name のような名前を生成するにはどうすればよいですか? SQL Server でも!
あなたがやろうとしていることを行うにはいくつかの方法があると思います。
1 つ目は、マッピング ファイルで名前を指定することです。一意のキーで試したことはありませんが、外部キーで機能することはわかっています。
<property name="KeyId" column="KeyId" type="Int" unique="true" unique-key="MyKeyName"/>
NHibernate.Cfg.INamingStrategy
NHibernate 内では、実装するクラスを作成し、 nhibernate を構成するときにそのクラスを追加することで、命名戦略を変更できます。
ISessionFactory sf = new Configuration()
.SetNamingStrategy(new YourNamingStrategy())
.Configure()
.SchemaExport(true, false);
これは、休止状態にするために組み込まれている改良されたNamingStrategyでもあります。何を出力したか思い出せませんが、試してみる価値はあります
ISessionFactory sf = new Configuration()
.SetNamingStrategy(ImprovedNamingStrategy.Instance)
.Configure()
.SchemaExport(true, false);
編集
私が見つけた他のいくつかの可能性があります最初のものはプロパティタグに関係しています。使用できる多数の属性を持つ列タグがあります。
<property name=KeyID>
<column name="KeyId" unique-key="MyKeyName"/>
</property>
もう1つはもう少し複雑です。次のようなものを追加できます
<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 ステートメントを作成するを実装するクラスを作成します。nhibernate.info のNHiberate マニュアルを
見て、下にスクロールします。
5.6. 補助データベース オブジェクト
これは、何をする必要があるかを説明しています。
現在、NHibernate でネイティブにこれを行う方法は (まだ) ありません。問題追跡システムを調べたところ、2.0 で開かれ、修正されていない問題が見つかりました。先に進んで NHibernate のソースをダウンロードしたところ、この問題を簡単に修正できました。プロジェクトを構築するのは簡単ではありませんが、一度取得してしまえばそれほど難しくありません。ここにコード スニピットを投稿しますが、そのためには少し大きいので、必要な場合はお知らせください。
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