2012-03-06 3 views
1

EF의 dbContext가 어떻게 작동하는지 혼란 스럽습니다.Entity Framework 컨텍스트와의 혼동

_context.Persons.Add(_person) (person이 유효한 엔티티라고 가정)을 수행하는 경우, 내가 (_context.SaveChanges()를 호출하기 전에) Person을 쿼리하면 방금 추가 한 사람이 결과에 포함됩니까? 예를 들어

: 나는이 시도 할 때마다 컨텍스트가 나는 상황이 새로운 사람을 추가 한 사실의 트랙을 잃는 것처럼

Person _person = new Person() {Firstname = "Bill", Lastname = "Snerdly"}; 
_context.Persons.Add(_person); 
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne")); 

것 같습니다.

내가 혼란스러운 점은 기존 사람을 편집하고 사람을 첨부하고 상태를 수정 된 것으로 설정하면 컨텍스트를 쿼리하면 변경 한 내용을 추적하여 결과에 반환하는 것입니다. 예를 들어이 경우

//Assuming that Person 5 exists with the name William Snerdly 
Person _person = new Person() {Id = 5, Firstname = "Bill", Lastname = "Snerdly"}; 
_context.Persons.Attach(_person); 
_context.Entry(_person).State = System.Data.EntityState.Modified; 
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne")); 

, 대신 윌리엄의 이름을 빌과 함께 목록에 표시됩니다 (5)의 ID를 가진 사람처럼 보인다. IOW, 컨텍스트는 데이터를 쿼리했지만 변경 사항은 유지했지만 첫 번째 시나리오에서는 컨텍스트가 데이터를 쿼리했지만 추가 된 항목은 무시했습니다. 그냥 조금 어색해 보입니다.

이 내용을 올바르게 이해하고 있습니까, 아니면 누락 되었습니까?

감사합니다.

답변

3

아니요, 아직 데이터베이스에 없으므로 아닙니다. 그러나 ObjectContext의 ObjectStateManager를 통해 액세스하거나 DbContext/DbSet 래퍼를 사용하는 경우 DbSet의 .Local 속성을 통해 액세스 할 수 있습니다.

편집의 경우 작업에서 ORM의 첫 번째 레벨 캐시가 표시됩니다. 쿼리는 데이터베이스에 대해 실행됩니다 (예 : 문맥에서 성을 수정했지만 변경되지 않은 성을 찾는 쿼리에서 결과를 얻으면 예제가 더 이상 어둡습니다). 결과가 처리되면 먼저 반환 된 엔티티의 ID가 확인되고 해당 ID를 가진 엔티티가 컨텍스트에 이미 있으므로 해당 인스턴스를 다시 가져옵니다. 이것은 기본 "AppendOnly"작동 모드입니다.

뭘하고 싶은지 모르겠지만로드 된 항목과 읽지 않은 항목 둘 다의 값을 사용해야하는 규칙에 따라 변경 내용의 유효성을 검사하려고 할 때 모든 것을 이해해야했습니다. "None"옵션을 사용하여 변경 내용을 저장하고 데이터 유효성 검사를 다시 한 다음 데이터가 "병합 된"보기를 포함하는 트랜잭션을 시작하고 데이터가 유효하지 않은 경우 트랜잭션을 롤백했습니다. 그렇지 않으면 accepting the changes과 트랜잭션을 커밋합니다.

+0

냉소, 답변 해 주셔서 감사합니다. 내 게시물을 편집하는 동안 당신은 대답했습니다. 컨텍스트가 편집을 존중하는 이유는 무엇입니까 (데이터베이스에 커밋되지는 않았지만)? – RHarris

+0

지금 업데이트하십시오. 도움이되기를 바랍니다. – cynic

+0

고마워. 그 말은 많은 의미를 지니고 있으며 실제로 내가하려고 한 일을 실제로 다룬다. EF4.1과 함께 거래하는 방법을 살펴볼 필요가 있습니다. – RHarris