2017-02-07 1 views
0

Entity Framework를 사용하여 엔티티의 부분 업데이트를 신속하게 허용하기 위해 구현할 수있는 패턴을 찾으려고합니다. 전체 개체가있을 때 Attach를 사용할 수 있지만 부분 업데이트 만 수행하는 경우 매번 변경된 속성을 지정하지 않고 반복적 인 방식으로 작업을 수행하는 방법을 찾고 싶습니다.Entity Framework를 사용하여 부분 엔티티를 업데이트하기위한 패턴

나는 this idea을 찾았지만 정말 좋아하지만 "OriginalValues"와 "CurrentValues"가 달라지기 위해 고심하고 있습니다. 항상 일치합니다. 이와 같은 업데이트 메소드가 작동하도록 엔티티를 검색하려면 어떻게해야합니까?

데이터를 검색하여 페이지의 정보를 채우는 데 사용합니다 (사용자가 엔티티의 일부만 변경하거나 볼 수 있음). 그래서 게시물의 일부 엔티티 정보 만 다시 가져옵니다. 이 같은 업데이트 전에 엔터티 검색 및 분리? 컨트롤러에서이 작업을 수행하지 않기 때문에 Try/UpdateModel을 사용할 수 없습니다. 어떤 아이디어 나 다른 패턴도 인정 될 것입니다.

public virtual void Update(T entity, params Expression<Func<T, object>>[] updatedProperties) 
{ 
    //Ensure only modified fields are updated. 
    var dbEntityEntry = DbContext.Entry(entity); 
    if (updatedProperties.Any()) 
    { 
     //update explicitly mentioned properties 
     foreach (var property in updatedProperties) 
     { 
      dbEntityEntry.Property(property).IsModified = true; 
     } 
    } 
    else 
    { 
     //no items mentioned, so find out the updated entries 
     foreach (var property in dbEntityEntry.OriginalValues.PropertyNames) 
     { 
      var original = dbEntityEntry.OriginalValues.GetValue<object>(property); 
      var current = dbEntityEntry.CurrentValues.GetValue<object>(property); 
      if (original != null && !original.Equals(current)) 
       dbEntityEntry.Property(property).IsModified = true; 
     } 
    } 
} 
+0

jquary를 사용하지 않는 이유는 무엇입니까? – Hadee

+0

나는 jquery가 내가 성취하려는 것을 해결할 것이라고 생각하지 않는다. 브라우저에서 가져온 내용에 관계없이 객체/부분 객체가 서버에 도착하면 변경된 속성 만 업데이트하려고합니다. – Josh

답변

0

중복 된 질문 일 수 있습니다. 나는 대답 here를 찾았다.

업데이트 된 속성과 데이터베이스의 값을 비교하려면 데이터베이스에서 문서를 다시로드해야합니다. 한 가지 예 : 내가 성취하려는 것처럼 분명히

public ActionResult Edit(Document document, bool sendEmail, string commentsTextBox) 
    { 
     if (ModelState.IsValid) 
     { 
      var documentInDB = docsDB.Documents.Single(d => d.Id == document.Id); 

      docsDB.Entry(documentInDB).CurrentValues.SetValues(document); 

      foreach (string propertyName in docsDB.Entry(documentInDB) 
              .OriginalValues.PropertyNames) 
      { 
       var OriginalValue = docsDB.Entry(documentInDB) 
            .OriginalValues.GetValue<object>(propertyName); 
       var NewValue = docsDB.Entry(documentInDB) 
           .CurrentValues.GetValue<object>(propertyName); 

       if (!OriginalValue.Equals(NewValue)) 
       { 
        //capture the changes 
       } 
      } 
     } 
    } 

는 비즈니스 계층에서 구현하기 위해, 당신은 데이터베이스 버전과 비교 방법에 업데이트 된 버전을 모두 통과해야 할 것이다.

테스트를 마친 후 작동하는 샘플이 있으면 코드를 업데이트합니다.

+0

나는 아직도이 일을 정말로 할 수 없었다. 현재 값/원래 값은 포스트 백의 "new'd"개체로 인해 예측할 수 없습니다. – Josh

관련 문제