2009-03-14 11 views
2

私はFluent NHibernateで多対多コレクションをマップしようとしています。Fluent NHibernate HasManyToMany with Index

public virtual IList<Resource> Screenshots 
{ 
    get { return _screenshots; } 
    protected set { _screenshots = value; } 
} 

そして、私の流暢なマッピングは次のとおりです:私のモデルクラスは、このプロパティを持っている

HasManyToMany(x => x.Screenshots) 
       .AsList(x => x.WithColumn("Index")) 
       .Cascade.AllDeleteOrphan(); 

私は自分のアプリケーションを実行すると、私は次の例外メッセージが出ます:

要素「リスト'名前空間 ' urn:nhibernate-mapping-2.2 'に 子要素' many-to-many ' 無効な名前空間 ' urn:nhibernate-mapping-2.2 'があります。可能な要素のリスト : 'index、 list-index' inネームスペース 'urn:nhibernate-mapping-2.2'。

これを行う方法があります。誰かが私が間違っていることを知っていますか?

+0

多対多の関係でリンクテーブルを使用していますか? – gcores

+0

私はこれがFluent NHibernateのバグであることを発見しました。最新のビルドでは固定であると文書化されています。 – EisenbergEffect

+1

このバグレポートと該当するバージョン番号へのリンクを使用して、自分自身でこれに答えることができます。 –

答えて

3

次のようにこのため、現在のFluentNHibernate構文は次のとおりです。

HasManyToMany(x => x.Screenshots) 
    .AsList(i => i.Column("`Index`")); 

インデックスにインデックス列のデフォルト値が、それは、SQL Serverで予約語(そしておそらく他のデータベースすぎ)ですので、あなたがそれを引用しなければなりませんバックティック。

また、この関係をカスケード設定しないことをおすすめします。以下のコードを考えてみましょう:

x.Screenshots.Remove(s); 
session.SaveOrUpdate(x); 

NHibernateはカスケードを指定しなくてもリンクテーブルから行を正しく削除します。しかし、AllDeleteOrphanを指定すると、NHibernateはその行をリンクテーブルから削除し、リソースsも削除します。私はこれがあなたが多対多の関係で欲しい行動であるとは思わない。