2013-12-12 1 views
2

Entity Framework 5.0 및 SQLite 데이터베이스를 사용하고 있습니다. 데이터베이스 레코드를 수정 한 다음 동일한 테이블의 엔티티 개체 인스턴스를 사용하여 동일한 레코드를 읽는 시나리오가 있지만 이전 값을 얻습니다. 디버깅하는 동안 내 데이터베이스 도구로 이동하여 레코드를 보면 변경 사항이 있지만 EF가 해당 파일을 선택하지 않습니다. 그것은 나중에 그들을 데리러 갈 것이지만 나는 그것이 언제인지를 판단 할 수 없다.Entity Framework SaveChanges가 오래된 값을 가져옵니다.

다음은 코드 단편입니다. 우선 업데이트 사용 SaveChanges를()를 수행

tblTest efTestTbl = context.tblTests.Find(recID); 
context.tblTests.Attach(efTestTbl); 
efTestTbl.Value1 = "newValue"; // This changed it from "oldValue" :-) 
int changedRecs = context.SaveChanges(); 

이 코드는 위의 항상 작동하는 것 같다 데이터베이스에 변경 사항을 저장합니다. changedRecs는 1이됩니다. 코드에서이 지점 다음에 중단하고 데이터베이스 도구를 사용하여 데이터베이스의 값을 볼 수 있으며 열은 "newValue"와 같습니다. 내가 컨텍스트 개체의 직접 다른 테이블 객체와 이전 업데이트 후 다음 읽기,하지만 동일한 인스턴스를 수행하는 경우 이제

:

tblTest efTestTbl = context.tblTests.Find(recID); 

efTestTbl.Value1의 값은 "oldValue입니다"를 동일합니다 . 나는 아무것도 캐싱하지 않는 EF에 대한 의견을 보았지만 그것이 사실이라고 믿을 수는 없다. 다른 포럼에서 ObjectQuery에 대한 MergeOption에 대한 대화를 보았고 캐싱을 "신원 확인"이라고했습니다. 이 정보는 유익했지만 쿼리와 "ExecuteNonQuery()"메서드를 사용하지 않아서 도움이되지 않았습니다.

필자의 시나리오에서는 변경 사항을 기록한 다음 데이터베이스에서 확인 단계로 변경 내용을 읽고 기록해야합니다.

캐시를 플러시하는 방법을 찾으면 도움이 될 것입니다.

+0

코드에서 동일한 컨텍스트 인스턴스를 사용하고 있습니까? –

답변

1

컨텍스트 내에서 어떤 일이 일어나고 있는지에 따라로드하려는 개체가 이미 다른 컨텍스트에있을 수 있습니다.

이것은 이전에 해결하기 위해 수행 한 작업입니다. 분명히 다음

public static class ZarettoContextExtensionClass 
{ 
    public static tblTest Reload(this tblTest item, DbContext c) 
    { 
     c.Configuration.AutoDetectChangesEnabled = false; 
     c.Entry(item).Reload(); 
     c.Configuration.AutoDetectChangesEnabled = true; 
     return item; 
    } 
} 

당신이 할 것 :

efTestTbl.Reload(context) 
+0

아니겠습니까 : public static tblTest Reload (이 tblTest 항목, DbContext c) ?? –

+0

@RobertAchmann 예, 실제로 편집했습니다. –

0

당신이

tblTest efTestTbl = context.tblTests.FirstOrDefault(t => t.Id == recID); 

대신

tblTest efTestTbl = context.tblTests.Find(recID); 

의 당신이 EF 데이터베이스를 조회 할 것이라는 점을 확신 할 수 있습니다 사용하는 경우와 당신은 지속 된 데이터를 얻습니다.

Find() 메서드 사용 EF는 개체가 DB 컨텍스트에 없는지 먼저 확인한 다음 DB 쿼리 만할지 여부를 결정합니다.

왜 오래된 데이터를 가져오고 있지만 문제를 해결해야하는지에 대한 질문에는 대답하지 않습니다.

나는 왜 당신이 이미 첨부 된 엔티티 efTestTbl에서 .Attach() 메소드를 사용하고 있는지 궁금합니다. 어느 시점에서 Detached()를 추적하고, 추적되지 않은 변경 사항을 수행하고 나중에 행운의 우연으로 저장 한 잘못된 값 (DB와는 다름)으로 Attattached 한 것으로 보입니다.

AutoDetectChanges도 사용하고 있습니까?

관련 문제