2011-02-02 60 views
0

實體框架:中調用「讀取」當DataReader關閉實體框架:調用「讀取」當DataReader關閉

我得到這個問題的間歇性,當我砸我的並行異步調用的服務。

我明白讀者在我定義的EF查詢中調用.ToList()時會被訪問。

我想找出構建EF查詢以避免這種情況和similar問題的最佳做法。

我的體系結構如下:

我的實體數據層是一個靜態類,帶有靜態構造函數,實例化我的實體(_myEntities)。它還在我的實體上設置屬性,例如MergeOption。

這個靜態類公開靜態方法,它只是訪問實體。

public static GetSomeEntity(Criteria c) { 
    ... 
    var q = _myEntitites.SomeEntity.Where(predicate); 
    return q.ToList(); 
} 

這已在生產工作了一段時間,但上述錯誤和一個here間歇性發生,尤指客戶在重負載下。

我目前正在設置MultipleActiveResultSets =我的連接字符串爲True。

回答

1

這就是所有問題的根源。不要使用shared context,也不要使用共享上下文作爲data cache或中央數據訪問對象 - 它應該被定義爲EF中的主要規則之一。這也是你需要MARS的原因(我們之前討論的問題現在已經解決了)。當多個客戶端在同一時間在共享上下文上執行查詢時,它會在同一個數據庫連接上打開多個DataReader。

我不確定你爲什麼得到你當前的異常,但我相信你應該重新設計你的數據訪問方法。如果您還修改共享上下文上的數據,則必須使用

+0

再次正確!最初我擔心創建一個新的對象上下文引用,並設置它的所有屬性(跟蹤,超時)的開銷,但我只是運行一些測量的測試,並沒有太大的區別。再次感謝! – 2011-02-02 19:34:01

0

試圖獲得一個巨大的,從數據庫數據量的時候,所以試圖設置連接超時在你的代碼,下面的問題可能來自於連接超時:

實體5 ((IObjectContextAdapter)本.context).ObjectContext.CommandT imeout = 1800;

其他實體: this.context.Database.CommandTimeout = 1800;

相關問題