2011年8月26日 星期五

使用 Entity Framework 查詢出來的是舊資料?

使用entity framework也有幾個月的時間了
因為一開始是在web上開發,後來到win form上面才發現到這個問題
一個簡單的程式如下:


pubilc class Demo
{
private DemoEntities _db = new DemoEntities();

public void Query()
{
var enumProducts = from product in _db.Products
select product;
}
}


當第一次執行Query()時,查詢出來的資料都是正確的
之後手動到資料庫去變更Products資料表中的資料後
當執行第二次Query()後,發現查詢出來的還是之前的資料

原來每個ObjectSet都會自己維護查詢後的資料,也就是會將查詢後的資料放在物件中
在ObjectSet中有一個稱為MergeOption的屬性,是用來處理新查詢結果和物件中資料的合併方式

有四種狀態如下:
AppendOnly(預設):有查到新的資料列就新增到物件中,若資料表有變更過的資料列,並不會更新到物件中
OverwriteChanges:不管資料表中的資料列是新增或是修改過,都覆蓋原先物件中的資料。
PreserveChanges不管資料表中的資料列是新增或是修改過,都覆蓋原先物件中的資料,但原先物件中的某筆資料的狀態如果為modified則不會被覆蓋。
NoTracking:不維護物件中的資料。

以上為不精確的解釋,詳情請參考

最後補充一下為什麼用web開發時沒遇到這個情形
因為每要求一次頁面就會重新建立DemoEntities所以維護的資料都重新來過,就不會發生這種問題

所以除了AppendOnly狀態以外自己看情況選擇其他的狀態吧

對了對了 ObjectSet還有一個Method叫Refresh() 可以動態決定什麼時候要更新,有興趣在研究吧~