2011-08-18 2 views
36

공식 설명서에 엔티티를 수정하라는 메시지가 있습니다. DbEntityEntry 객체를 검색하고 속성 함수로 작업하거나 상태를 수정 됨으로 설정합니다. 그것은 다음 예제를 사용합니다엔티티 프레임 워크 - 명시 적으로 엔티티 상태를 수정 된 것으로 설정하는 이유는 무엇입니까?

Department dpt = context.Departments.FirstOrDefault(); 
DbEntityEntry entry = context.Entry(dpt); 
entry.State = EntityState.Modified; 

2 번째와 3 번째 문장의 목적을 이해하지 못합니다. 그때 SaveChanges를에 EF()을 요구하는 경우에 나는 다음

dpt.Name = "Blah" 

에서와 POCO을 수정 않습니다 1 문 같은 엔티티 프레임 워크를 요구하는 경우에, 엔티티 수정의 상태를 (난이 스냅 샷 추적을 통한 추측, 이는 프록시가 아닙니다.) 상태를 수동으로 설정할 필요없이 변경 사항이 지속됩니다. 내가 여기서 뭔가를 놓치고 있니?

답변

38

시나리오에서는 실제로 상태를 설정할 필요가 없습니다. 연결된 엔티티의 값을 변경하고 수정 된 상태로 전환 한 것을 확인하기 위해 변경 내용 추적의 목적입니다. 분리 된 엔티티 (변경 추적없이로드되거나 현재 컨텍스트 외부에서 작성된 엔티티)의 경우 수동으로 상태를 설정하는 것이 중요합니다.

+4

확인해 주셔서 감사합니다. 제가 읽은 많은 튜토리얼은이 접근 방식을 혼란스럽게 사용하는 것 같습니다. – SeeNoWeevil

16

마찬가지로 연결이 끊어진 엔터티가있는 시나리오에서는 엔터티의 상태를 Modified으로 설정하는 것이 유용 할 수 있습니다. 데이터베이스에서 엔티티를 가져 와서 수정 및 저장하는 대신 단절된 엔티티를 연결하는 경우 데이터베이스로의 왕복을 절약합니다.

그러나 상태를 Modified으로 설정하지 않는 매우 좋은 이유가있을 수 있습니다. (Ladislav가이를 알고 있었지만 여전히 여기에 나와 있습니다.)

  1. 변경 사항뿐만 아니라 레코드의 모든 필드가 업데이트됩니다. 업데이트가 감사되는 많은 시스템이 있습니다. 모든 필드를 업데이트하면 많은 양의 혼란이 발생하거나 감사 메커니즘을 통해 잘못된 변경 사항을 필터링해야합니다.

  2. 낙관적 동시성. 모든 필드가 업데이트되므로 필요 이상의 충돌이 발생할 수 있습니다. 두 명의 사용자가 동일한 레코드를 동시에 업데이트하지만 동일한 필드를 업데이트하지 않으면 충돌이 발생하지 않아도됩니다. 그러나 항상 모든 필드를 업데이트하는 경우 마지막 사용자는 항상 부실 데이터를 작성하려고합니다. 이것은 최적의 동시성 예외 또는 최악의 경우의 데이터 손실을 야기 할 수 있습니다.

  3. 쓸모없는 업데이트. 엔티티는 수정 된 것으로 표시됩니다. 변경되지 않은 엔티티는 또한 업데이트를 실행합니다. 세부 정보를보기 위해 편집 창이 열리고 OK에 의해 닫힌 경우 쉽게 발생할 수 있습니다.

그래서 균형이 잘 잡혀 있습니다. 왕복 수를 줄이거 나 중복성을 줄입니다.

어쨌든, Modified로 설정 상태에 대한 대안 (DbContext API를 사용하여)된다

void UpdateDepartment(Department department) 
{ 
    var dpt = context.Departments.Find(department.Id); 
    context.Entry(dpt).CurrentValues.SetValues(department); 
    context.SaveChanges(); 
} 

CurrentValues.SetValuesModified는 개별 특성을 표시한다.

+0

@GertAmold,'CurrentValues.SetValues'가 상주하는 네임 스페이스를 설명해 주시겠습니까? 나는 ** ASP.NET 코어 1.0 **에서 그것을 얻을 수있다. –