web-dev-qa-db-ja.com

EntityFrameworkでオブジェクトとそれに関連するすべてのエンティティを削除します

オブジェクトグラフを手動でトラバースして各エンティティを削除せずに、EF内のオブジェクトとそれに関連するすべてのエンティティを削除する方法を知っている人はいますか?

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

これはEFで可能ですか?

26
LPCRoy

EntityFrameworkでこれを行うべきではありません。すべての一般的なリレーショナルデータベースは、外部キーでON CASCADE DELETEをサポートしており、これもはるかに効率的です。私はあなたがそれで行くことをお勧めします。

26
aleemb

この記事では、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のようなものを開くと、EFが知っている(つまり、ObjectContextにロードされている)依存エンティティに対してDELETE要求を発行していることに気付くでしょう。プリンシパルが削除されます。基本的に、ここで起こっていることは、Entity Frameworkがデータベース内のプリンシパルを削除すると、データベース内のすべての依存関係が削除されることを期待していることです。したがって、すでにロードされている依存関係がObjectContextから削除されるように、それ自体を要求するための冗長なDELETEが発行されます。注意すべき重要な点は、EFはすべての依存エンティティを取得せず、それらの削除を発行しないことです。すでにメモリ内にある依存エンティティのみを削除します。

7
Marco Staffoli