0

私はテーブルAとテーブルBを持っています:

TableA(IDTableA,...) TableB(IDTableB, IDTableA,...)

これをデータベースに設定すればcascadaで削除できることは知っていますが、データベースでこれを定義しておらず、EFの子を削除したい場合は、これが最善の方法ですか?

この状況を想像してみてください。ユーザーAがコンテキストに親を追加し、ユーザーAが子をコンテキストに追加し、親と子を削除済みとしてマークして、変更を保存します。しかし、ユーザーAが子をロードして変更を確認するまでの間にユーザーBが新しい子を追加した場合、ユーザーBによって追加された新しい子は削除されないか、参照整合性のために例外が発生します。

トランザクションを使用して親を削除済みとして設定しようとすると、次の手順で、を作成するsavechangesと、親レジスタがロックされるため、他のユーザーがロードできなくなります。ただし、問題は同じです。他のユーザーは、親がロードされてから変更が保存されるまでの間に、親に変更を加えることができます。

だから私の質問は、EFを持つ親とそのすべての子を削除したい場合、これが最善の方法ですか?最善の方法は、親をN回削除してみることです。私が良いパフォーマンスをしたいとき、これは良いオプションですか?

ありがとう。ダイムロック。

4

2 に答える 2

1

あなたはあなた自身の質問に答えました。カスケード削除を使用します。最初に EF コードを使用してそれらを有効にすることができます。最初に EF コードのテーブル リレーションシップでカスケード削除が有効になっていることを確認するにはどうすればよいですか? を参照してください。、またはリレーションシップをカスケードとしてマークすることによってデザイナーを使用します。

于 2013-01-27T19:23:59.653 に答える
0

この特定のケースでは、トリガーを使用して子を削除するのが最善の方法だと思います。

于 2013-01-28T12:22:12.247 に答える