2011-09-27 28 views
0

在我的web應用程序中,我們使用每個請求DbContext。我們在Application_BeginRequest()中創建DbContext,將其存儲在HttpContext.Items中,然後在Application_EndRequest()中對其調用Dispose。實體框架是否將其DbContext與高速緩存的查詢計劃一起存儲?

我們通過包裝類DatabaseContext.Current屬性使當前上下文可用。

偶爾,針對該數據庫上下文中執行查詢時,我們得到以下異常:

「的ObjectContext的實例已經設置,不能再用於需要連接的操作」。

我搜索了我們的代碼,發現我們正在調用的任何可能性在其他地方的上下文....我們不是。

是常見故障查詢是這一個:

var user = (from u in DatabaseContext.Current.Users 
      where u.UserName == username 
      select u).FirstOrDefault(); 
return user != null; 

所有我能想到的是深藏在它是保持在一個緩存查詢計劃到的DbContext的引用,然後試圖將EF的腸子是在執行查詢時重用該上下文。我已經通過反射器查看了它,它似乎確實有一些內部參考了ObjectContext。

有沒有辦法可以禁用linq查詢緩存?任何人有任何線索?

另一種可能性是來自Context上一次調用的查詢正在使Context處於不良狀態。但是,沒有任何跡象表明這會失敗。

這是使用Sql CE的Entity Framework 4.1(現在,我們很快將遷移到生產SQL Server實例)。

回答

1

您的情況都不應該發生。沒有你提到的緩存。有一些可能性,你應該檢查改爲:

  • EndRequest後或外部電流HttpRequest範圍
  • 你是存儲在緩存或會話的地方上下文檢索的實體和其他請求處理使用它的使用上下文 - 這可能是一個問題,因爲實體可以保留對已部署的上下文的引用並將其用於某些操作。

沒有自動的LINQ查詢緩存 - 它是功能計劃在即將到來的EF釋放,但該功能緩存DbCommand情況下,獨立於上下文。

+0

有時候在你明顯突然跳出來之前,你必須打幾次頭。謝謝你的答案。由於我的上下文包裝中存在一個錯誤,你的第一個項目符合原因。 –

0

您將得到此異常「ObjectContext實例已被處置並且不能再用於需要連接的操作」 - 因爲在嘗試訪問數據查詢之後存在失敗的事務。試一試,觀察異常情況。確切地說,有一個例外,這是不正確的處理。