2009-06-01 16 views
26

オブジェクトグラフとその関連エンティティを、手動でオブジェクトグラフをトラバースして削除する必要はありません。Entity Frameworkでオブジェクトと関連エンティティをすべて削除する

たとえば、SalesOrderとSalesOrderDetailsの間に1:Nの関係があります。 SalesOrderを削除すると、すべてのSalesOrderDetailsが自動的に削除されます。

これはEFで可能ですか?

答えて

26

これはEntity Frameworkで行うべきではありません。すべての一般的なリレーショナルデータベースでは、外部キーのON CASCADE DELETEがサポートされています。私はちょうどそれと一緒に行くことをお勧めします。

+7

Yeap。データベース内の関係をカスケード削除して、それをEFモデルに持ち込むと、EFはメモリ内の従属エンティティを実際に削除して、インメモリオブジェクトグラフをデータベースと同期させて保持しようとします。しかし、データベースの仕事である関連するすべての関連オブジェクトを削除するEFに頼るべきではありません。 –

+2

ありがとうアレックス、私はCASCADE DELETEがメモリ内の状態を台無しにするのではないかと心配しましたが、EFがそれを最新に保っていれば、これはうまくいきます! – LPCRoy

+0

これは他の関連するエンティティについて心配する必要がないので、これは非常に良い解決策です。 DB上のカスケード削除を設定するだけで、すべてがクリーンでシンプルになります。 – torpederos

7

この記事のAlex Jamese(彼の答えを投稿する人)には、このトピックに関する完全な記事があります。

http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx

EF)はSaveChangesをした後のObjectContext(の正確性に責任があります。したがって、EFはObjectContextを、データベース内の予想されるカスケードの後に​​予想されるデータベース状態と同期させようとします。 SqlProfilerのようなものを開いた場合、は、プリンシパルが削除されたときに知っている(つまり、ObjectContextにロードされている)従属エンティティに対するEF発行DELETE要求に気づくでしょう。 ここでは、Entity Frameworkはデータベース内のプリンシパルを削除し、そのデータベース内のすべての従属物を削除することを想定しています。それで、それは要求されるべき冗長なDELETEを発行し、すでにロードされている従属オブジェクトがObjectContextから削除されるように要求します。 重要な点は、EF がすべての依存エンティティを取得し、それらに対して削除を発行しないことです。すでにメモリ内にある従属物のみが削除されます。

関連する問題