2

FluentNHibnernateを使用して多対多のコレクションをマッピングしようとしています。私のモデルクラスには次のプロパティがあります。

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'の要素'list'には、名前空間'urn:nhibernate-mapping-2.2'の無効な子要素'many-to-many'があります。予想される可能な要素のリスト:'index、list-index' in namespace'urn:nhibernate-mapping-2.2'。

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

4

1 に答える 1

3

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

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

インデックス列はデフォルトで Index になりますが、これは SQL Server (およびおそらく他のデータベースも) の予約語であるため、バックティックで引用する必要があります。

また、この関係にカスケードを設定しないことをお勧めします。次のコードを検討してください。

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

NHibernate は、カスケードが指定されていなくても、リンク テーブルから行を正しく削除します。ただし、 AllDeleteOrphan を指定すると、NHibernate はリンク テーブルから行を削除し、 Resource も削除しますs。これが、多対多の関係で必要な動作であるとは思えません。

于 2011-05-07T05:05:50.117 に答える