2012-03-17 3 views
3

SQL CE 4.0에 연결하기 위해 C#, .NET (4.0) 및 Entity Framework를 사용하고 있습니다.C# Entity Framework Linq 새 변경 내용을 인식하지 못하는 쿼리

특정 속성을 가진 일부 개체를 쿼리하지만 해당 데이터가 데이터베이스에 이미 저장되어있는 경우에만 검색 조건을 충족하는 개체 만 반환합니다. 문제가되지는 않지만 더 큰 문제는 데이터가 변경되었지만 아직 변경되지 않은 경우입니다. 데이터베이스에 저장하면 검색 조건을 계속 충족합니다.

예 :

var query = from location in mainDBContext.Locations 
      where location.InUse == true 
      select location; 

이 쿼리는 반환 객체 곳 DB에서로드 한 후 코드에서 나중에 변경할 때 사용중이 사실 경우는 false location.InUse =.

이것은 조회 결과 오브젝트 중 하나로부터의 화면 캡처입니다. 그것은이 작업을 수행하는 이유

enter image description here

은 정말 이해가 안 돼요. 나는이 쿼리가 항상 데이터베이스를 쿼리하고이 오브젝트의 이전 버전을 얻는 지 이해할 것이다 (따라서 InUse가 참일 것이다).

시간과 답변에 감사드립니다.

답변

3

그.

해당 키로 고유하게 식별되는 모든 엔티티는 문맥별로 한 번만 추적 할 수 있습니다 (that is called identity map). 따라서 쿼리를 몇 번이나 실행했는지는 중요하지 않습니다. 쿼리가 추적 된 엔터티를 반환하고 동일한 컨텍스트 인스턴스에서 반복적으로 실행되는 경우 항상 동일한 인스턴스를 반환합니다.

응용 프로그램에서 인스턴스가 수정되었지만 데이터베이스에 저장되지 않은 경우 쿼리는 지속 상태가 평가되는 데이터베이스에서 실행되지만 구체화 프로세스는 기본적으로 검색된 데이터 대신 응용 프로그램의 현재 데이터를 사용합니다 데이터베이스 데이터베이스에서 쿼리가 (mainDBContext.Locations.MergeOption = MergeOption.OverwriteChagens을 설정하여) 반환하도록 강제 할 수 있지만 ID 맵 때문에 현재 수정 사항이 손실됩니다.

+0

답장을 보내 주셔서 감사합니다. 로컬 데이터에서 쿼리를 실행할 수 있습니까? – Ben

+2

[예 가능합니다] (http://stackoverflow.com/questions/8210267/entityframeworks-object-cahe-getting-already-retieved-objects/8210523#8210523). –

1

나는 정확히 문제가 뭔지 정말 모르겠어요,하지만 난 당신이 알고 있다고 생각 :

  • 쿼리의 종류는 항상 DB에 제출 된 데이터를 반환합니다. 코드에서 일부 엔터티를 변경했지만 데이터베이스로 전송되지 않으면 LINQ 쿼리는 코드 변경없이 데이터베이스에서 데이터를 쿼리합니다.

  • LINQ 쿼리는 지연된 실행을 사용하므로 '쿼리'변수가 결과 목록이 아니므로 결과가 필요할 때마다 평가되는 쿼리 정의 일뿐입니다. 해당 쿼리를 평가하고 특정 코드 줄에서 결과 목록을 얻으려면 .ToList()을 추가해야합니다. .ToList()에 대한

예는 : EF는 내부적으로 어떻게 작동

var query = (from location in mainDBContext.Locations 
       where location.InUse == true 
       select location).ToList(); 
1

방금 ​​같은 일이 생겼습니다. 약간 지저분하지만 또 다른 옵션은 로컬 캐시를 검사하는 것입니다.이렇게 할 수 있습니다 (예 :

var query = from location in mainDBContext.Locations.Local 
      where location.InUse == true 
      select location; 

)이 작업은 데이터베이스에 저장되지 않은 로컬 캐시 만 사용합니다. 로컬 쿼리와 데이터베이스 쿼리를 함께 사용하면 원하는 것을 얻을 수 있습니다.