deleteAllOnSubmit
などの操作はSQLに変換されず、その場で実行されない ことに注意する必要があります。
ITable.DeleteAllOnSubmitメソッド:
コレクションのすべてのエンティティを保留中の削除状態にします。
参照: http: //msdn.microsoft.com/en-us/library/system.data.linq.itable.deleteallonsubmit.aspx
次の操作を行うまで、削除は行われません。
db.SubmitChanges();
アップデート1:
テーブルが空の場合、削除ステートメントは発生しません。さらに、SubmitChanges
その仕様により、特定のシナリオで賢くしようとすることが許可されていますが、トリガーが実行されると思った場合は失望します。削除/挿入トリガーがある場合は、LINQの「削除」の後にSubmitChangesを使用することを検討してください。
DataContext.SubmitChangesメソッド: 挿入、更新、または削除される変更されたオブジェクトのセットを計算し、適切なコマンドを実行してデータベースへの変更を実装します。
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.submitchanges.aspx
注:この更新は、OPが呼び出されたときにテーブルが空であることを確認し、確認した後に行われましたSubmitChanges()
。後の時点で、OPは、データがテーブルから削除されて同一のデータに置き換えられた場合にもこれが発生することを確認しました。
アップデート2:
@ブライアンあなたがこのようなもので進歩していると聞いてうれしいです:-)
一般的なアドバイス:
- 何をしているのかわからない限り、ExecuteCommandとL2Sを混在させないでください。
ExecuteCommand
は、L2Sの足元にあるデータベースの状態を変更し、(当然のことですが)頭痛の種になる可能性があります。このような頭痛の種を恐れていない場合は、ExecuteCommand
L2Sがテーブルにアクセスする前に、行を削除してみてください(より高速ですが、正しく実行する必要があります)。このような頭痛の種を恐れていて、SQLサーバーで「削除時」イベントを発生させたい場合SubmitChanges
は、質問のコードでL2Sの「削除」の後に実行してください。
- を使用して、データベースとのきめ細かいL2Sインタラクションに依存することもできますが
SubmitChanges
、長期的には、まったく新しい方法でデータベースとインタラクションするためのツールが提供されていることを理解する方がはるかに優れています。L2Sは賢くしようとしますが、それは悪くありません。あなたの利点にそれを使用してください!この特定のケースでは、何もしなくても、不要な削除/挿入操作を節約でき、事実上、コードを最適化できます。その賢くしようとするのは間違っていますか?はい、操作を個別に考え、いいえ、実行しようとしているのはコードのアクションの正味の効果でDBを更新することだけだと思う場合はありません。