2016-08-18 11 views
1

은 다음과 같이 진행됩니다이상한 행동

MyDbContext ctx = new MyDbContext(); 

IFooRepository repo = new FooRepository(ctx); 
var items = repo.GetAvailableItem().ToList(); //this will query all item.sold = false. 

// here it returns three rows 
foreach(var item in items) { 
    item.sold = true; 
} 

repo.commit();  // this will call the SaveChanges() in DbContext 

Thread.sleep(10000) 

// Now I quickly execute a query in SQL Server Management Studio 
// UPDATE Item SET Sold = 0; 
var items02 = repo.GetAvailableItem().ToList(); // this will query all item.sold = false. 

// here items02 also contains three rows 
// HOWEVER, when I watch the value of item.sold in items02, it is all True 

이 디자인에 의해 행동인가?

왜? 그것은 DbContext가 엔티티를 캐시하고 동일한 쿼리를 다시 실행하더라도 결코 리프레시되지 않기 때문입니까?

public IQueryable<Item> GetAvailableItem() 
{ 
    var items = from x in DbContext.Item 
         where x.Sold == 0 
         select x; 
    return items; 
} 

public virtual int Commit() 
{ 
    return DbContext.SaveChanges(); 
} 
+3

이'GetAvailableItem을()'게시'()'방법을 커밋하십시오 참조하십시오. 커밋에 뭔가 이상한 것 같습니다. –

답변

4

OK :


UPDATE 여기

내 환매 특약의 코드입니다. 다음과 같은 상황이 발생합니다.

  1. 새 컨텍스트 만들기.
  2. 데이터베이스에서 항목을로드하는 중 GetAvailableItem()
  3. Context가로드하고 캐시합니다.
  4. 컨텍스트를 통해 항목을 업데이트 중입니다. 그래서 : db 행이 업데이트되고 캐시 된 버전도 업데이트됩니다.
  5. (SSMS를 통해) 컨텍스트 외부에서 순수 SQL을 통해 항목을 업데이트합니다. 그래서 : db 행이 업데이트됩니다. 그러나 이전 컨텍스트와 동일한 컨텍스트를 사용하고 있으며 자체 버전의 항목을 가지고 있으므로 외부에서 발생하는 상황을 알 수있는 방법이 없으므로 캐시 된 버전의 항목은 그대로 유지됩니다. 업데이트되지 않습니다. .

외부에서 변경 사항을 알고 싶다면 가장 쉬운 방법은 새 컨텍스트를 만들고 다시 쿼리하는 것입니다. 또 다른 방법은 데이터베이스에서 yourContext.Entry<YourEntityType>(entityInstance).Reload();으로 엔티티를 다시로드하기 위해 상황을 설명하는 것입니다.

+0

좋은 설명. 이제 어떻게 작동하는지 이해합니다. 에티엔 느는 또한 무언가를 매우 중요하게 말합니다. dbContext를 사용하여 작업 할 때는 가능한 한 짧게 유지하는 것이 올바른 방법입니다. – Terrence

+0

Ur wlcm. 또한 다음을 기억하십시오 : 1. 저장소에서'IQueryable'을 반환하는 것은 좋지 않습니다. 2. 저장소 패턴을 사용하는 것은 좋은 습관이 아니며 'DbContext'는 저장소 자체입니다. –

+0

오, 나중에 IList를 돌려 주겠다. 감사 – Terrence

1

내 생각에 DbContext은 데이터베이스에서 발생한 변경 사항이 최신이 아닙니다 (Thread.sleep 중에 업데이트를 실행 중이라고 말했을 것입니다). DbContext은 이러한 업데이트를 선택하지 않습니다 (데이터가 캐시 됨).

그런 이유로 컨텍스트의 망원경을 가능한 짧게하고 동시성을 줄이기를 원합니다. 이것은 예상되는 동작입니다.

MSDN post