2011-05-05 6 views
7

EF4 POCO/저장소를 사용하는 MVC3 앱이 있습니다. 항목이 웹 사이트에서 사용자에 의해 열릴 때마다 데이터베이스에 플래그가 지정됩니다. 더 많은 'x'초 동안 플래그가 지정된 항목이 있는지 확인하고 백엔드를 해제하는 백엔드 서비스가 있습니다. 내가 실행중인 문제는 백엔드 서비스에서 내가 실행하는 쿼리가 플래그가 지정된 항목을 찾는 것처럼 보이지만 플래그가 지정된 개별 항목을 확인할 때 엔티티가 새로 고쳐지지 않았습니다. EF4 - 데이터가 새로 고침/업데이트되지 않음

다음은 플래그 항목

var list = Context.Transactions 
      .Where(t => t.Locked).ToList() ; 

list.Count() 나에게 정확한 수를 반환 찾는 내 코드입니다. 그러나 '목록을 반복하면서 시작하면 t.Locked = false가됩니다.

SQL 프로파일 러를 실행하면 위의 코드에서 데이터가 데이터베이스에서 올바르게 검색된다는 것을 알 수 있습니다. 이 캐싱 또는 ID 맵 문제로 인해 EF를 올바르게 사용하고 있지 않습니다.

답변

12

매우 신중하게 읽으십시오 this answer. 그런 다음 각 요청 (웹의 경우)에 대한 새 컨텍스트와 백엔드 서비스의 각 시간 이벤트에 대한 새로운 컨텍스트를 사용하도록 애플리케이션을 리팩터링하는 것이 좋습니다.

EF는 ID 맵 패턴을 사용합니다. 엔티티가 컨텍스트에 의해로드되면 기본적으로 새 쿼리에서 반환 된 데이터에도 불구하고 항상 같은 값으로 동일한 인스턴스가 생성됩니다. 엔티티를 새로 고치도록 EF를 강제하는 방법이 있지만 대부분 동시성 문제를 해결하기위한 것입니다.

당신은 여전히 ​​당신의 응용 프로그램이 상쾌 값을 강제로 이것을 사용 변경 유죄 판결을하지 않는 경우 :

var query = (ObjectQuery)(yourLinqQuery); 
query.MergeOption = MergeOption.OverwriteChanges; 
// Now iterate/execute query 
관련 문제