2012-03-17 80 views
3

我正在使用C#,.NET(4.0)和實體框架連接到SQL CE 4.0。C#實體框架Linq查詢無法識別新更改

我查詢了一些具有特定屬性的對象,但是查詢只返回符合搜索條件的對象,只有當這些數據已經保存到數據庫時,這不是問題,更大的問題是如果數據發生變化,但還沒有保存到數據庫它將仍然符合搜索條件。

實施例:

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

該查詢返回也是對象,其中location.InUse = false,如果從DB加載,然後在代碼改變稍後當INUSE是真實的。

這是查詢結果對象之一的屏幕截圖。

enter image description here

我真的不明白爲什麼它這樣做。我會理解,如果這個查詢總是查詢數據庫,我會得到這個對象的舊版本(因此InUse將是真實的)。

謝謝你的時間和答案。

回答

3

即EF的內部工作原理。

由其密鑰唯一標識的每個實體只能由上下文跟蹤一次 - that is called identity map。因此,您執行查詢的次數並不重要。如果查詢返回跟蹤的實體,並且如果它在同一個上下文實例上重複執行,它將始終返回相同的實例。

如果實例在應用程序中被修改但未保存到數據庫中,您的查詢將在數據庫上執行,其中持久化狀態將被評估,但實例化過程將默認使用來自應用程序的當前數據而不是從數據庫檢索到的數據數據庫。您可以強制查詢從數據庫返回狀態(通過設置mainDBContext.Locations.MergeOption = MergeOption.OverwriteChagens),但由於身份映射,您當前的修改將會丟失。

+0

謝謝你的回答。有沒有可能對本地數據執行查詢? – Ben 2012-03-17 18:11:59

+2

[是的,這是可能的](http://stackoverflow.com/questions/8210267/entityframeworks-object-cahe-getting-already-retieved-objects/8210523#8210523)。 – 2012-03-17 18:36:47

1

我真的不知道到底你的問題是什麼,但我認爲你必須知道這一點:

  • 這種查詢總是返回被提交到數據庫的數據。當您更改代碼中的某些實體但未將其提交到數據庫中時,LINQ查詢將查詢數據庫中的數據,而無需進行代碼內更改。

  • LINQ查詢使用延遲執行,因此您的'查詢'變量不是結果列表,它只是每次需要結果時評估的查詢定義。您應該添加.ToList()以評估該查詢並獲取該特定代碼行中的結果列表。

一個例子.ToList()

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; 

這將只使用本地緩存而不保存到數據庫。本地和數據庫查詢的組合應該使你得到你想要的。