저는 데스크톱 응용 프로그램에서 MVVM 디자인 패턴이있는 EF6 + WPF를 사용하고 있습니다. 나는 또한 DI 컨테이너로 Autofac을 사용하고 있습니다.EF에서 이전 값을 반환합니다.
EF 컨텍스트 수명 관리에 대해 많이 읽었으며 단일보기 모델 인스턴스에 대해 EF 컨텍스트 인스턴스를 하나만 사용하기로 결정했습니다. 이 접근법에 대한 몇 가지 흥미로운 기사를 발견 했으므로 EF 컨텍스트를 관리하는 것이 좋은 방법 일뿐입니다. Autofac을 사용하여 EF 수명을 관리하므로 새로운 뷰 모델을 만들 때마다 새로운 EF 컨텍스트가 하나만 만들어집니다.
물론, 문제가 생겼습니다. 대부분의 EF 쿼리는 올바르게 작동하지만 다음 쿼리는 항상 오래된 (캐시 된) 값을 반환합니다. 나는이 질문을 내가 버튼을 '실행'밀어마다 전화, 그래서 난 항상 코드를
this.context.Entry(entity).Reload();
을 다음과 같이 엔티티를 다시로드 할 수 있습니다 알고
this.context.someTable.Where(arg => arg.value == "value").Single();
단일 뷰/뷰 모델에 따라 많은 사형 집행이있다 하지만 제게는 좋은 해결책이 아닙니다. 또한 현재 컨텍스트를 처리하고 다음 쿼리 이전에 다시 작성하면 항상 현재 값을 받게된다는 것을 알고 있습니다. 그러나이 접근법은 하나의 뷰 모델 접근법 당 하나의 컨텍스트와 충돌합니다.
EF 캐싱 문제를 피하고 여전히 우수한 성능을 유지하려면 어떻게 수정해야합니까? 방법 힘 EF 데이터베이스에 쿼리를 다시 쿼리하고 결과를 캐시하지 않는 다음
MVVM 컨트롤러의 someTable 부분입니까? 또는이 컨트롤러가 다른 테이블에서 데이터를 읽는 중입니까? 이 창을 열고 다른 창에서 데이터를 변경 한 다음이 창에서 업데이트 된 데이터가 보이지 않는 것 같습니다. 우리는 DB Read 구문의 컨텍스트와 someTable의 관련성을 명확히 할 필요가 있습니다. – Todd
MVVM 로직을 DB 구조와 분리하려고 시도하므로 매우 자주 단일 MVVM이 여러 테이블에서 데이터를 읽습니다. MVF 계층에서 EF 엔티티를 사용하지 않고 대신 bussiness 객체/모델 객체를 사용합니다. 내 현재 문제는 DB에 새 비즈니스 개체를 저장하는 것입니다. 나는 'var entity = this.context.someTable.Where (arg => arg.value == "value")의 현재 값을 기반으로 한 어떤 인덱스 (DB 인덱스가 아님)를 계산해야한다. 엔티티 (증분)를 갱신해야합니다. 물론 다른 앱의 다른 사용자가 동일한 작업을 수행하면 EF 컨텍스트가 이전의 '엔터티'(EH 캐싱으로 인해)를 반환합니다. – rraszewski
@Todd가 답변을주었습니다. 수명이 긴 EF 컨텍스트를 현실적으로 기대할 수 없습니다. 자신의 상황에서 다른 PC의 다른 응용 프로그램에서 다른 사용자가 현재 추적중인 엔티티를 수정했음을 알 수 있습니다. * 다시로드하지 않으면 컨텍스트가 db로 돌아가고 다시로드됩니다. 그러나 당신은 어떤 이유로 그것을하고 싶지 않습니다. – Mashton