1

這個MSDN Blog Post建議使用工廠模式來獲取「每個應用程序的每個請求的UserManager實例」。與此同時,我的Web應用程序拋出一個錯誤,說它是有問題的「,如果同一個上下文實例被多個線程同時訪問。」這個博客似乎與這個異常信息相矛盾。是什麼賦予了?ASP.NET標識工廠模式是否會破壞EntityFramework DbContext?

,我收到的異常以下調用發生:

IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

較大的博客背景:

您可以使用工廠實現從OWIN場景中獲得的UserManager 的一個實例。這種模式類似於我們使用 從OWIN上下文中獲取AuthenticationManager和 SignOut的AuthenticationManager。這是爲應用程序的每個請求獲取 UserManager實例的推薦方法。

全部異常文本:

的情況下被創建的模型,而不能使用。如果在 OnModelCreating方法中使用上下文,或者同時由多個線程訪問同一上下文實例,則可能會拋出此 異常。請注意,DbContext 和相關類的實例成員不保證是線程安全的。 「

+0

如果是每個請求,你如何從多個線程訪問它? –

+0

我想到一個ASP.NET請求可能有多個線程。 –

+0

VS2013 SPA模板是一個非常好的地方,可以將這個(文檔記錄不完整)的東西從中刪除。 – spender

回答

4

的FactoryPattern不斷裂的DbContext;相反,它可以防止多線程問題

UserManager.CreateAsync被扔,因爲我們沒有正確地實現工廠模式除外

這下面是正確的。它每次調用UserManagerFactory函數創建MyDbContext的新實例,並防止多線程問題。

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

以下錯誤。它與上面類似,但不會爲每次調用UserManagerFactory創建一個新實例。這是我們使用的,我們有一個DbContext的應用程序,這意味着與多個線程同時共享,並blammo,異常。

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

我得到的問題會導致此:

IdentityResult導致=等待的UserManager .CreateAsync(用戶,model.Password);

UserManager是授權過濾器類的屬性,不直接從函數的上下文中調用。

正確: var userManager = context。獲取<「ApplicationUserManager」>()