2013-01-20 4 views
0
var user = userContext.Users.First(u => u.Id == 1); 
user.Name = "John"; 
userContext.SaveChanges(); 

EF은 이름 열만 변경되어 SQL 쿼리를 업데이트하는 것을 어떻게 알 수 있습니까?내부적으로 작동하는 방법

EF은 엔티티를 어떻게 추적합니까?

엔티티의 사본을 데이터베이스에서 가져온 후 메모리에 보존 한 다음 해당 엔티티를 컨텍스트의 수정 된 엔티티와 비교합니까?

답변

3

짧은 대답은 '예'입니다. EF는 데이터베이스에서 읽은 데이터의 "원본"복사본을 유지합니다. change tracking on MSDN에 대한 자세한 내용을 볼 수 있습니다.

+0

감사합니다. 메모리에 수정 된 개체와 원래 개체가 있습니까? 나는 그 행이 많은 행에 어떻게 작용하는지 궁금해. 하지만 옴이 변경 사항을 추적 할 수있는 다른 방법은 없다고 생각합니다. –

+0

대개 수 많은 엔티티를 한 번에 수정하지 않을 것입니다. 일반적인 작업 과정에서는 많은 수의 레코드를 표시하고 사용자가 수정 및 업데이트 할 레코드를 선택하도록합니다. DAL에서 "추적 없음"옵션을 사용하는 간단한 "읽기"와 변경 내용 추적을 사용하여 읽는 "읽기 위해 읽음"과 다른 작업을하는 것이 유용 할 수 있습니다. – LeffeBrune

1

Entity Framework에는 변경 내용을 추적하는 각 모델마다 Proxy 클래스를 생성 할 수있는 옵션이 있습니다. 기본적으로 자체 추적 속성으로 객체를 래핑합니다.

기본적으로, 당신은 내가 실제 내부의 잘 ​​모르겠어요 (그것을 이런 식으로 뭔가를 구현 구상 할 수 있지만 이것은 당신이 어떻게하는지 정확히를보고 싶은 경우 디 컴파일 수 있으며, 이론에 조금 도움이 될 것입니다) :

각 필드에 대해 복제이와 분명히
internal List<string> ChangedFields = new List<string>(); 

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { 
     ChangedFields.Add("Name"); 
     _name = value; 
    } 
} 

, 각 필드는 다음 ChangedFields에 추적을 변경합니다.

다시, 즉, 명시 적 get/set와 속성을 사용하여 작업 할 수있는 방법의 설명을위한 순수하지특히 엔티티 프레임 워크가 어떻게하는지.

+0

하지만 프록시가 아닌 프록시되지 않은 인스턴스가있는 경우도 있습니다. 이 경우 어떻게 작동합니까? –

+0

@OpCoder 프록시 생성을 사용하지 않으려면, 뒷받침 ObjectContext가 실제로 추적을 수행합니다. 컨텍스트를 사용하여 데이터베이스에서 객체를 가져올 때, 객체의 사본을 저장하고, 저장시'DetectChanges()'를 사용하여 차이점과 저장해야 할 것이 있는지 확인합니다. –

관련 문제