2011-05-05 71 views
7

我有一個使用EF4 POCO /庫一個MVC3應用程序。每當用戶在網站上打開一個項目時,它就會在數據庫中被標記。有一個後端服務,不斷檢查是否有任何項目已被標記更多「x」秒並取消標記。那我遇到的問題是在我的後端服務,我運行查詢,似乎找到了標記的物品,但是當我檢查單個項目的被標記的實體還沒有刷新。EF4 - 數據沒有得到刷新/更新

這裏是我的代碼看起來爲標誌項

var list = Context.Transactions 
      .Where(t => t.Locked).ToList() ; 

的list.Count()返回我正確的號碼。但是,當我開始迭代通」列表中我發現,t.Locked =假

當我運行SQL事件探查器,我可以看到我上面的代碼數據從數據庫正確檢索。這是緩存還是身份映射問題,我沒有正確使用EF。

回答

12

閱讀非常仔細this answer。從那以後,我建議你重構你的應用程序中使用新的上下文爲每個請求(在網絡的情況下)和新的上下文中的後端服務,每次事件。

EF使用恆等映射圖案。一旦實體被上下文加載,默認情況下,即使從新查詢返回數據,也會始終使用相同的值獲取相同的實例。有辦法強制EF刷新實體,但主要是爲了解決一些併發問題。

如果您還沒有被定罪改變你的應用程序中使用這種強制清爽值:

var query = (ObjectQuery)(yourLinqQuery); 
query.MergeOption = MergeOption.OverwriteChanges; 
// Now iterate/execute query