2009-05-07 3 views

答えて

14

もっとして1つのプロパティにインデックス/一意の制約名を割り当てる

<property name="A" index="AB" /> 
<property name="B" index="AB" /> 

、それはまた、同じエンティティにもっとして1つのインデックスを持つ働くだろう理論:

<property name="A" index="AB, ABC" /> 
<property name="B" index="AB, ABC" /> 
<property name="C" index="ABC" /> 

But there is a bug.私もパッチを書いた。もしあなたがこれに興味があれば、バグに投票したり、コメントなどを追加してください。

を編集してください:the bugに何が起こったかを確認しました。これはバージョン2.1.0で修正されているので、今は完全に動作するはずです。偉大なNHibernate開発チームのおかげです!

+3

Fluent NHibernateの場合、SetAttributeを使う必要があります。 Map(x => x.A).SetAttribute( "index"、 "AB"); –

+1

流暢なNHibernateは 'SetAttribute'を使わなくても' .Index( "IndexName ...") 'をサポートするようになりました。 – Phill

+0

'index'(と 'unique-key' too)プロパティは、CREATE TABLE文を生成し、NHibernateがセッションを使用しているときにNHibernateが重複行を挿入しようとしても、NHibernateがCREATE TABLE文を生成するときにのみ使用されます。保存するなど – mayu

14

古いが、私はこの同じ問題に出くわしたので、私は追加する何かを持っている:

Stefan Steinegger -uniqueマルチカラム・インデックスに対して正しく答えたが、ユニーク複数列のコードを残しインデックス。それらのために使用することができます:

<property name="A" unique-key="AB" /> 
<property name="B" unique-key="AB" /> 

したがって、本質的には同じですが、属性名が異なります。


注意する興味深いのは、一意索引のため、NHibernateのはキーのために独自の名前を生成していることであるが、非一意索引のために、それはあなたがそれを与えるものは何でも使用しています。

たとえば、上記のコードでは、 "AB"というユニークなインデックスは生成されませんが、UQ__TableName__7944C87104A02EF4のようなものが生成されます。

これは、NHibernateのドキュメントのsection 19.1.1で文書化されています

一部のタグは、その列の インデックスの名前を指定するためのindex属性を受け入れます。 unique-key属性を使用して、 列を1つのユニットキー制約にグループ化することができます。現在、unique-key属性の指定された の値は、ではありません。は、マッピングファイルの列をグループ化する場合にのみ、制約の名前を付けるために使用されます。

ただし、以下:

<property name="A" index="AB" /> 
<property name="B" index="AB" /> 

ちょうど "AB" という名前のインデックスを生成します。

関連する問題