ASP.NET身份工厂模式是否会破坏EntityFramework DbContext?

时间:2014-01-25 02:13:28

标签: c# asp.net multithreading entity-framework asp.net-identity

MSDN Blog Post建议使用工厂模式获取“每个应用程序请求的UserManager实例”。与此同时,我的Web应用程序抛出一个错误,说“如果多个线程同时访问相同的上下文实例,则会出现问题”。该博客似乎与异常消息相矛盾。是什么给了什么?

我收到的例外情况发生在以下电话中:

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

更大的博客背景:

  

您可以使用Factory实现来获取UserManager的实例   来自OWIN的背景。这种模式类似于我们使用的模式   从OWIN上下文获取AuthenticationManager以获取SignIn和   登出。这是获取实例的推荐方法   每个应用程序请求的UserManager。

完整的例外文字:

  

创建模型时无法使用上下文。这个   如果在内部使用上下文,则可能抛出异常   OnModelCreating方法或者如果访问相同的上下文实例   并发多个线程。请注意DbContext的实例成员   和相关的类不保证是线程安全的。 “

2 个答案:

答案 0 :(得分:4)

FactoryPattern 打破DbContext;相反,它可以防止多线程问题。

UserManager.CreateAsync抛出了异常,因为我们没有正确实施工厂模式。

以下是正确的。它为每次调用UserManagerFactory函数创建一个新的MyDbContext实例,并防止出现多个线程问题。

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

以下内容不正确。它看起来与上面类似,但它不会为每次调用UserManagerFactory创建一个新实例。这是我们正在使用的,我们为应用程序提供了一个DbContext,这意味着同时与多个线程共享它,以及blammo,exception。

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

答案 1 :(得分:0)

我遇到了这个问题:

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

UserManager是授权过滤器类的属性,不直接从函数中的上下文调用。

<强>正确: var userManager = context.Get&lt;&#34; ApplicationUserManager&#34;&gt;()