2010-12-01 7 views
2

私はまだEF4の複雑さを学んでいる開発者です。私はオブジェクトのリストをプルダウンしてループでそれらを削除する方法をよく知っていますが、n個のレコードに対してn個のステートメント(およびデータベースのラウンドトリップ)を実行するコードを記述することはできません更新または削除。EF4を使用して効率的な複数行のDELETEまたはUPDATEを実行できますか?

このための古典的なケースでは、参照整合性を...私は「ストアドプロシージャでは

(はい、私はデフォルトはなく、ユーモア私がソフト削除を採用)を維持するために、関連する親レコードを削除する前に子レコードを削除しています私はこれを行うだろうLINQ to SQLので

DELETE FROM someChildTable WHERE ForeignTableId = @keyToGo 
DELETE FROM parentTable WHERE Id = @keyToGo 

:ちょうどそうのように、SQLを実行dはNHibernateので

dataContext.ChildrenTable.DeleteAllOnSubmit(from c in dataContext.ChildrenTable 
              where c.ParentTableId == keyToGo 
              select c); 
dataContext.ParentTable.DeleteOnSubmit(parentToGo); 
dataContext.SubmitChanges(); 

を私はこれを行うだろう。

nhSession.CreateQuery("delete from ChildrenTable where ParentTable.Id = :keyToGo") 
         .SetInt32("keyToGo", keyToGo) 
         .ExecuteUpdate(); 
nhSession.Delete(parentToGo); 

私は、これらのいずれかのEF同等物が成功せずに探しました。 EF4のコンテキスト内でこれを行うには、実際にはストアドプロシージャに戻る必要がありますか? 私は願っていません。シェアしてください。

+0

私はEFを知らないので質問には答えられませんが、NHibernateの場合、Cascade AllまたはCascade Deleteをオンにするだけで、子のためのクエリを作成する必要はありません関係。 – Phill

答えて

2

EFはORM - オブジェクトリレーショナルマッパーです。リレーショナルデータベースの行と列を.NETオブジェクトモデルにマッピングすることは素晴らしいことです。これは、1つまたはいくつかのオブジェクトの読み込み、挿入、更新に最適です。

EFは設計されており、大規模な操作を処理するためのツールとして意図していない、それはバッチ削除など、バッチ更新を行うように設計され、最適化さないだされ、これらを実行するためのいずれかを使用してまっすぐADO.NETではるかに優れて処理されますそれらのT-SQLコマンドをデータベースに対して実行するか、ストアドプロシージャを呼び出して作業を実行するだけです。

このような状況では、削除操作を処理するためのストアドプロシージャを作成し、そのストアドプロシージャをEFモデルにインポートして、EntityContextのメソッドのように呼び出すことができます。持ち上げる。

1

データベース内の親オブジェクトと子オブジェクトの関係を「すべてカスケード」にする場合は、EFから行う必要があるのは親オブジェクトを削除することだけです。子オブジェクト(今は孤児と呼ばれる)は、データベースによって削除されます。現時点では、EFでこれを効率的に行う方法は他にありません。

+0

カスケード更新と削除は、データベース側の機能です。これをEFに定義する必要がありますか? – Tahbaza

+0

EF側で定義が必要ない:) – basarat

0

Cascade Allを使用したくない場合は、ObjectContext.ExecuteStoreCommand関数をチェックして、データストアに対してアドホッククエリを実行できるようにしてください。 これは、一括削除または更新を実行する最も効率的な方法です。

関連する問題