2011-09-07 9 views
0

을 수행하려는 레코드의 메모 열에 추가합니다.Entity Framework에서 최소 업데이트 수행

내가 원하지 않는 것은은 전체 레코드를 가져 오는 것이므로 매우 중요합니다.

여기에 수행하는 코드가 있어요 하지 일 :

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

EF에서 간단한 최소한의 업데이트에 관해서는,이 같은 상황에 객체를 부착하여이를 수행 할 수 있습니다

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

afai 엔티티 프레임 워크에서는 불가능합니다. 유일한 최적화 인 일 수 있습니다. 레코드 엔티티를로드하고 엔티티를로드하지 않고 업데이트 할 때 "중요한로드"를 발생시키는 모든 속성을 지연로드하는 것입니다.

처음 엔 엔터티를로드하지 않으려면 ExecuteStoreQuery()을 사용하여 이러한 성능에 중요한 업데이트에 대해 SQL을 직접 실행할 수 있습니다.

결국 EF는 CRUD를 훨씬 쉽게 만드는 ORM이지만이 추상화를 사용하여 성능 가격을 지불합니다.

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

다음이 저장 프로 시저에 간단한 UPDATE 문이 : 같은 -

+0

를 당신이 잘되지 않았다 기대했다을; Linq에서 SQL을 사용하여이 작업을 수행 할 수도있었습니다. 그러나 그것이 바로 그 것이다. 이에 대한 귀하의 의견에 감사드립니다. –

1

엔티티 프레임 워크 (또는 다른 ORM)이 작업을 수행하는 가장 쉬운 방법은 저장이 절차를 사용하는 것 일을하기 위해서.

엔티티 프레임 워크에서

, 당신은 당신의 개체 컨텍스트에 그 저장 프로 시저를 가져올 수 있습니다 그리고 당신은 개체 컨텍스트의 방법으로 호출 할 수 있습니다 :

만이 하나의 SQL UPDATE 문이 실행됩니다

string AppendNote(int key, string note) 
{ 
    using (MyEntities _Context = new MyEntities()) 
    { 
     _Context.UpdateNote(key, note); 
    } 
} 
- 해당 행은 클라이언트에 불필요하게 전송되지 않습니다.

+0

+1 저장 프로 시저가 가장 좋은 방법입니다. –

관련 문제