0

ここに私の問題があります:私は一連のIDを持っています。これらは、ルート エンティティのコレクションの ID です。ここで、これらすべてのルート エンティティを効率的に削除したいと考えています。

WHERE Id IN (1, 2, 3)子を持つルートエンティティを削除しているため、句のタイプを実行できません。

すべてのルート エンティティを取得して 1 つずつ削除することを回避できるかどうか疑問に思っています。そのアプローチの問題はそれほどではなく、SELECT多くの個別のDELETEステートメントがあります。

すべての子の削除を含め、NHibernate がこれをバッチ処理することは可能ですか? 余分な複雑さ: 子供は自分の子供を持つことができます。

したがって、NHibernate には、最初に IN 節を持つ「最下位」の子 (おそらく複数のもの) を削除し、次に IN 節を持つ子、最後に IN 節を持つルート エンティティを削除する必要があります。

これが不可能な場合、NHibernate を使用して複数のルート エンティティを効率的に削除する良い方法は何ですか?

4

2 に答える 2

2

UPDATE これは、IDのリストを持っていた(質問を正しく読まなかった)場合には無効です。

まず、adonet.batch_size、 http: //nhibernate.info/doc/nh/en/index.html#performance-batch-updates を設定して、「親」のバッチ削除を行うことができます。

更新を終了

次に、子の読み取りを回避する (およびこれらの削除を生成する) ために、ON CASCADE DELETE を外部キー制約として設定することにより、カスケード削除を db レベルで設定できます。

例 (削除時の属性に注意してください)

<set name="TheCollection" inverse="true" cascade="save-update">
 <key name="theKey" on-delete="cascade"/>
 <one-to-many class="TheType"/>
</set>

ご了承ください

  • これは、逆 (双方向) の関係でのみ機能します。
  • この fk 制約で db スキーマを更新する必要があります
  • cascade="all" など、削除が含まれる場所では使用しないでください
于 2013-05-28T13:12:06.100 に答える