2014-01-24 37 views
29

爲什麼當我們調用AccountApiController.Register()方法時會發生這種情況?「創建模型時無法使用上下文」使用ASP.NET標識的例外

  • 什麼是嘗試使用上下文?
  • 試圖創建上下文的是什麼?
  • 我們如何避免這種情況?
  • 我們該如何調試?

「消息」:「發生錯誤」。,

「ExceptionMessage」:「上下文不能用於正在被創建的模型 而此異常可能如果上下文拋出使用 的OnModelCreating方法裏面,或者相同的上下文實例 由多個線程同時訪問。需要注意的是實例成員的DbContext和相關的類 不能保證是線程安全的 「,

「ExceptionType」: 「System.InvalidOperationException」,

「堆棧跟蹤」:」

在System.Web.Http.ApiController.d__1.MoveNext()

---從棧跟蹤的結尾以前的位置,其中的例外是在System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebugger拋出

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務task)

通知(任務>任務)

在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()」

+2

確保你沒有使用相同的上下文對象不同的要求,並確保您OnModelCreating後發送請求解決它。你可以在方法結尾添加斷點。 –

+0

我們如何確保不會對不同的請求使用相同的上下文對象?另外,由於我們沒有OnModelCreating方法,因此我不確定添加斷點是什麼意思。 –

+0

我已經瞭解到ASP.NET身份使用工廠模式爲了獲得每個請求的UserManager的一個實例;這可能是一個問題,因爲我們的UserManager將數據存儲在我們的DbContext中。嗯。 –

回答

20

問題是我們沒有使用MS recommends的工廠模式。

您可以使用Factory實現從OWIN上下文獲取UserManager 的實例。 ...這是根據應用程序請求獲取 UserManager實例的推薦方式。

因此,「同一個上下文實例被多個線程同時訪問」,因爲多個請求和線程共享一個DbContext。

以下是正確的。它爲每次調用UserManagerFactory函數創建一個MyDbContext的新實例。

UserManagerFactory 
=() => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext())); 

以下錯誤。它看起來很相似,但不會爲每次調用UserManagerFactory創建一個新實例。這是我們正在使用的,我們的網站打破了。

var userStore = new UserStore<IdentityUser>(new MyDbContext());      
var userManager = new UserManager<IdentityUser>(userStore); 
UserManagerFactory =() => userManager; 
+3

我應該把這個放在我的項目上?我使用Unity.Mvc作爲依賴解析器。此外,我使用我自己的UnityOfWork工作,我注入了一個DbContext,它被共享給我的所有倉庫。 –

1

你重寫OnModelCreating方法?如果是這樣,你可以分享它還是整個背景課程?

如果沒有,你應該注意在錯誤消息

以下或者相同的上下文實例被多個線程同時訪問。請注意,DbContext和相關類的實例成員不保證是線程安全的。

如果這沒有幫助,是否使用由Visual Studio創建的未更改的Web API項目?

+0

我們不重寫OnModelCreating方法。另外,我們不使用未更改的Web API項目...相反,我們修改了DbContext,它同時存儲ASP.NET身份數據和其他網站數據。 –

+1

我們不確定如何確定同一個上下文實例是否被多個線程同時訪問。嗯。 –

+1

+1強調潛在的多線程問題。 –

21

如果出現錯誤connectionString,也會發生此錯誤。檢查connectionString是否有效(沒有錯字等)。

+2

謝謝你!連接字符串在我的情況下是不正確的。 – Isaac

+0

謝謝!這就是訣竅! –

0

如果您從Table/View獲取記錄,請確保您有足夠的數據庫對象訪問權限。

我有同樣的問題,我通過執行

sp_change_users_login [ @Action = ] 'action' [ , [ @UserNamePattern = ] 'user' ] [ , [ @LoginName = ] 'login' ] [ , [ @Password = ] 'password' ] [;] 


sp_change_users_login 'update_one' 'dbuser' 'dblogin' 

Find more snippet and details

相關問題