2009-08-18 14 views
2

ScottGuのブログでは、LinqのメソッドをSQLクラスにオーバーライドして、.NET側でデータの変更をカスタムでオーバーライドする方法を示します。ADO.NET Entity Framework Insert/Updates/DeletesのカスタムSQL式

http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

EFで同じ機能を実現する方法はあります(挿入/更新/ためのカスタムSQL式は、一部削除しますか)?

答えて

6

EF 3.5では、sprocs以外のオプションはありません。

しかし、EF 4.0のために、我々はExecuteStoreCommand(..)と呼ばれるObjectContextに新しいメソッドを追加して、関連する方法など

だから、(SaveChanges()をオーバーライドし、それが今の仮想あり、そしてObjectStateManagerはタイプにObjectStateEntriesを探してinterograteことができあなたが興味を持っているEntityState(つまり挿入されている)に興味があるのです。

これが見つかったら、新しいExecuteStoreCommand()メソッドを使ってデータベースに対して直接コマンドを実行できます。次にObjectStateEntryAcceptChanges()を呼び出すと、EFがすでに処理したデータベースの変更をフラッシュしないようにします。

その後、base.SaveChanges()を呼び出してEFに残りの変更をさせることができます。

私はこれが理想的ではないことを知っています。しかし、それは私が

のアレックス

+0

私は自分のために集計し明確にするだけです。私の質問を2:1に分割してみましょう)、efでデータベースにカスタムネイティブSQLを送ることは可能ですか? 2)いくつかのメソッドをオーバーライドし、データの更新/挿入/削除のプロセスをカスタマイズすることは可能ですか? 1)は3.5ではなく、4ではexecutestorecommand()で答えます。答えは2)SaveChangesをオーバーライドして、必要な操作を行います。ただし、3.5ではネイティブSQLは実行できませんが、他の操作は実行できません。 4はすべてを行う。正しい? –

+0

基本的にはYeap。 実際には3.5でもネイティブSQLを実行できます。 ObjectContextの下にあるEntityConnectionからStoreConnectionを取得できるためです。あなたが心配しなければならないのはトランザクション(3.5と4.0の両方)ですが、EFはTransactionScopeとうまく機能します。 –

1

EFでは、これらの操作をデザイナのマッピングタブのストアドプロシージャにマップすることができます。ストアドプロシージャの入力値と出力値をオブジェクトのさまざまなプロパティにマップできます。

役に立ったと思っています。

+0

そう考えることができる最善の回避策はありますが、私は –

+0

エンティティフレームワークが選択するためのコンセプトのこの種をサポートしています(アドレスの例のように).NET側の実装を探しています私の知っている限りでは更新、挿入、削除はできません。これらの操作にカスタムSQLスクリプトを使用する場合は、ストアド・プロシージャを使用する必要があります。ありがとうございます。 – LorenVS

関連する問題