あなたがコレクションのパフォーマンスのためのマニュアルを参照してください場合: http://nhibernate.info/doc/nhibernate-reference/performance.html#performance-collections-taxonomyNHibernate:バッグパフォーマンスの混乱。ドキュメントは古くなっていますか?
それは言う:
バッグは最悪のケースです。バッグは重複する要素値を許可し、インデックス列を持たないため、主キーを定義することはできません。 NHibernateは、重複行を区別する方法がありません。 NHibernateは、(1回のDELETEで)完全に削除し、コレクションが変更されるたびに再作成することで、この問題を解決します。これは非常に非効率的かもしれません。
ただし、この場合は確認できません。たとえば、私は次のコードで、バッグを使用して、カスケードのすべてを持つ単純な親子関係を持っている場合:
using (var sf = NHibernateHelper.SessionFactory)
using (var session = sf.OpenSession())
{
var trx = session.BeginTransaction();
var par = session.Query<Parent>().First();
var c = new Child { Id = 4, Name = "Child4" };
par.Children.Add(c);
trx.Commit();
}
私は、任意の削除が表示されませんが、子テーブルへの挿入とのParentIDのアップデート。これは実際に意味をなさない。しかし、それはドキュメントと矛盾しているようです。私は何が欠けていますか?
NHibernateは、あなたの 'Child'のような' Id'を使って参照しているEntity(および関連するRelation Table Row/Column)を時々把握できます。私は今は時間がありませんが、 'List'をBagにマップすると、それを試してみると、Parent_idとStringValueという2つのカラムしか持たないRelation Tableがあります。繰り返される 'strings'が存在します)、ドキュメンテーションの動作が記述されています。 –
starlight54
@ starlight54、それが本当である場合、私の結論は上記のドキュメントは値とコンポーネントのコレクションにのみ有効です。 –
NHibernateが他の制約を認識していなかった場合、それはColumns 'EntityA_id'と 'EntityB_id'を持つ多対多の関係テーブルにも適用される可能性があります(片側がBagとしてマッピングされ、逆ではありません)しかし、それはまた、 'Collection'でEntityの一意性を強制すると、どちらの側にも重複した一時的なEntityを追加すると' Exception'を投げてしまうかもしれませんが、私はそれについて確信していません。 ) – starlight54