2017-02-13 65 views
-1

在過去的幾天裏不同的連接問題,我們正在錄製由實體框架(第6版)在我們的現場舞臺拋出不同的異常,它只是偶爾出現,並顯示錯誤消息,這都涉及到數據庫連接。實體框架:發生偶爾

  • 不允許改變 '的ConnectionString' 屬性。連接的當前狀態將關閉。被創建的模型而

  • 上下文不能被使用。如果上下文中所使用的 OnModelCreating方法內,或者如果相同的上下文實例由 多個線程同時訪問這 可能會引發異常。請注意,DbContext 和相關類的實例成員不保證是線程安全的。

  • 意外的連接狀態。使用包裝提供程序時,確保 StateChange事件在包裝的DbConnection上實現。

  • 底層提供對打開失敗。

我們不能記住,我們已經改變任何東西,前面已經說了發生這些錯誤只是偶爾。我們不能在當地舞臺上覆制它們。

有沒有人有一個想法是什麼問題或如何調查?

編輯:它是一個ASP.NET MVC 5應用程序,它使用Unity IoC進行實例化。我們使用自行編寫的PerRequestLifeTimeManager,它在其他mvc應用程序中運行絕對平滑。

+0

所有步驟,你能共享的代碼?您是否能夠識別彈出錯誤的任何模式或用例?你有沒有任何應用程序日誌可以告訴哪一行代碼引發異常? –

+1

我很確定你是以錯誤的方式使用上下文。可能作爲靜態成員,但肯定可以通過多線程訪問。重構時間! –

+1

沒有代碼就說不出來。不過,我傾向於同意@GertArnold。每個請求應該只有一個上下文實例。如果你正在爲每個請求創建多個實例,或者相反地,靜態或單身使用它等,你將遇到問題。 –

回答

1

感謝@Gerd阿諾德和@克里斯普拉特的暗示我能找出我的問題的根本原因。

事實上,其中由被同時使用進行的跨多個請求的DbContext實例引起的異常。這個DbContext是一個服務的一部分,通過Unity屬性注入到一個動作過濾器中。我還不知道的是,APS.NET MVC中的動作過濾器沒有被實例化,但它們被緩存和重用。 因此,不要將DbContext或基於DbContext的類的實例注入到動作過濾器中!

我們解決了這個問題,通過調用DependencyResolver.Current.GetService<ClassType>()而不是用在我們的過濾器的代碼Dependency -attribute來獲取各自的依賴性的實例(請注意,您通過這個解決辦法失去了濾波器的可測性)

它花了我好幾個小時才找到解決辦法。對於偶爾會遇到與我的問題中提到的相同錯誤的用戶,我建議檢查您的應用程序是否有可能在請求/線程中同時使用的基於DbContext的類。

  1. 檢查統一的IoC規則
  2. 查找不打通IoC的實例,但可能同時使用的類。
  3. 檢查你在哪裏看到這個錯誤沿MVC request lifecycle