簡體   English   中英

ASP.NET身份工廠模式是否會破壞EntityFramework DbContext?

[英]Does the ASP.NET Identity Factory Pattern break the EntityFramework DbContext?

MSDN博客文章建議使用工廠模式來獲取“針對應用程序的每個請求的UserManager實例”。 同時,我的Web應用程序拋出一個錯誤,指出“如果多個線程同時訪問同一上下文實例,這是有問題的”。 該博客似乎與異常消息矛盾。 是什么賦予了?

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

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

更大的博客上下文:

您可以使用Factory實現從OWIN上下文中獲取UserManager的實例。 此模式類似於我們用於從OWIN上下文獲取AuthenticationManager的SignIn和SignOut的模式。 這是一種推薦的方法,用於針對應用程序的每個請求獲取UserManager實例。

完整的例外文字:

創建模型時不能使用上下文。 如果在OnModelCreating方法內部使用上下文,或者多個線程同時訪問同一上下文實例,則可能引發此異常。 請注意,不能保證DbContext和相關類的實例成員是線程安全的。

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;

我遇到了這個問題,原因是:

IdentityResult結果=等待UserManager .CreateAsync(user,model.Password);

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

正確 :var userManager = context.Get <“ ApplicationUserManager”>()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM