2016-11-17 9 views
0

あなたがコレクションのパフォーマンスのためのマニュアルを参照してください場合: 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のアップデート。これは実際に意味をなさない。しかし、それはドキュメントと矛盾しているようです。私は何が欠けていますか?

+0

NHibernateは、あなたの 'Child'のような' Id'を使って参照しているEntity(および関連するRelation Table Row/Column)を時々把握できます。私は今は時間がありませんが、 'List 'をBagにマップすると、それを試してみると、Parent_idとStringValueという2つのカラムしか持たないRelation Tableがあります。繰り返される 'strings'が存在します)、ドキュメンテーションの動作が記述されています。 – starlight54

+0

@ starlight54、それが本当である場合、私の結論は上記のドキュメントは値とコンポーネントのコレクションにのみ有効です。 –

+0

NHibernateが他の制約を認識していなかった場合、それはColumns 'EntityA_id'と 'EntityB_id'を持つ多対多の関係テーブルにも適用される可能性があります(片側がBagとしてマッピングされ、逆ではありません)しかし、それはまた、 'Collection'でEntityの一意性を強制すると、どちらの側にも重複した一時的なEntityを追加すると' Exception'を投げてしまうかもしれませんが、私はそれについて確信していません。 ) – starlight54

答えて

関連する問題