2011-09-07 7 views
0

は、レコードのメモ列に追加するだけです。エンティティフレームワークで最小限の更新を実行

私が望まないものは、レコード全体をフェッチすることが非常に重要です。

ここで行うコードだない作品:

string AppendNote(int key, string note) 
{ 
    using (MyEntities _Context = new MyEntities()) 
    { 
     var _Record = _Context.Records 
      .Where(x => x.Id == key) 
      .Select(x => new Record { Id = x.Id, Notes = x.Notes }) 
      .First(); 
     _Record.Notes += note; 
     _Context.SaveChanges(); 
    } 
} 

正しい方法は何ですか?

私はそれがこの非常に古い質問に非常に似て実現:Update statement with Entity Frameworkと、この似ていますが、最終的に非類似の質問:How to update a record without selecting that record again in ADO.NET Entity Framework?しかし、まだ、それはの方法であることを持っているようです。

答えて

2

、あなたはこのようにコンテキストにオブジェクトを取り付けることによって、それらを行うことができます。

string AppendNote(int key, string note) 
{ 
    using (MyEntities _Context = new MyEntities()) 
    { 
     var _Record = new Record { Id = key }; 
     _Context.Entry(_Record).State = System.Data.EntityState.Unchanged; 
     _Record.Notes = note; //a simple update 
     _Context.SaveChanges(); 
    } 
} 

ただし、現在の値にを追加します。以下のコードは、理由は匿名で型付けされた変数_Rで少し厄介ですが、それだけでノートの列をフェッチし、それに追加する必要があります。

string AppendNote(int key, string note) 
{ 
    using (MyEntities _Context = new MyEntities()) 
    { 
     var _R = _Context.Records 
      .Select(x=>new {Id = x.Id, Notes=x.Notes}) 
      .Where(x=>x.Id == key) 
      .First(); 
     var _Record = new Record { Id = _R.Id, Notes=_R.Notes }; 
     _Context.Entry(_Record).State = System.Data.EntityState.Unchanged; 
     _Record.Notes+= note; 
     _Context.SaveChanges(); 
    } 
} 
+0

私はただ知っていました*可能でした。 –

1

これは、Entity Framework afaikでは不可能です。唯一の最適化は、レコードエンティティをロードしてエンティティをロードすることなくエンティティを更新するときに、「重要な負荷」を引き起こすすべてのプロパティを遅延ロードしてロードすることです。

最初にエンティティをロードするのを避けたい場合は、ExecuteStoreQuery()を使用して、これらのパフォーマンスが重要な更新プログラムに対してSQLを直接実行できます。

最後に、EFはCRUDをもっと簡単にするORMですが、この抽象化を使用してパフォーマンス料金を支払うことになります。

+0

私はあなたが正しいはありませんでした期待していました。 LinqからSQLへのこのWASの可能性も迷惑です。しかしそれはそれです。これに関するご意見ありがとうございます。 –

1

Entity Frameworkの(または任意の他のORM)でこれを行うための最も簡単な方法、このためにストアドプロシージャを使用することです - のようなもの:

CREATE PROCEDURE dbo.UpdateNote(@Key INT, @Note VARCHAR(500)) 

し、そのストアドプロシージャで簡単なUPDATE文を持っています仕事をする。

Entity Frameworkのから、あなたのオブジェクトコンテキストにそのストアドプロシージャをインポートすることができ、その後、あなたはオブジェクトコンテキスト上のメソッドとして呼び出すことができます。

string AppendNote(int key, string note) 
{ 
    using (MyEntities _Context = new MyEntities()) 
    { 
     _Context.UpdateNote(key, note); 
    } 
} 

とのみ、この単一のSQL UPDATE文が実行されます - その行は不必要にクライアントに転送されません。 EFでシンプル最小限のアップデートについては

+0

+1ストアドプロシージャは、IMHOの最適なアプローチです。 –

関連する問題