2016-06-13 125 views
3

我們對數據庫請求使用ASP.NET Core和EF6。 潛在地,多個用戶可以同時訪問數據庫。我用單元測試來實現這種情況:同時發生多個請求時的意外連接狀態

Parallel.For(0, 10, count => { 
    result = userRepo.Sessions.Any(session => session.Token == token); 
}); 

拋出異常:Unexpected connection state. When using a wrapping provider ensure that the StateChange event is implemented on the wrapped DbConnection

這是我完全理解的東西:代碼嘗試使用相同的連接並行訪問數據庫,但連接在一個請求完成之前關閉。好吧,但是使用ASP.NET核心和依賴注入,可以在兩個請求之間共享相同的連接,因此它可能會像上面的測試一樣崩潰。我們使用AddScoped來註冊DI容器中的數據庫服務。

我有什麼我在我們的架構中失蹤?

+3

通常,dbcontext將根據請求進行作用域,每個請求都有自己的連接,該連接超出作用域並位於請求的末尾。 –

+3

兩個請求**不能**使用相同的連接,因爲它們是有作用域的(默認情況下)。 Scoped將爲每個請求創建一個DbContext實例。您所嘗試的不是ASP.NET Core請求的工作方式。您將不得不爲每個循環迭代實例化一個新的用戶存儲庫和一個新的上下文。閱讀:你的單元測試是錯誤的;) – Tseng

+3

如果多個HTTP請求使用同一個'DbContext'實例,那麼你做錯了。此單元測試正在測試不應發生的情況。 – David

回答

0

經過大量的調查,我們發現了這個問題。我們緩存了整個C#lambda表達式,這些表達式通過實體框架訪問數據庫,因此從一個HTTP請求到另一個HTTP請求,DbContext是相同的,這就是拋出此異常的原因。