此MSDN Blog Post建议使用工厂模式获取“每个应用程序请求的UserManager实例”。与此同时,我的Web应用程序抛出一个错误,说“如果多个线程同时访问相同的上下文实例,则会出现问题”。该博客似乎与异常消息相矛盾。是什么给了什么?
我收到的例外情况发生在以下电话中:
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
更大的博客背景:
您可以使用Factory实现来获取UserManager的实例 来自OWIN的背景。这种模式类似于我们使用的模式 从OWIN上下文获取AuthenticationManager以获取SignIn和 登出。这是获取实例的推荐方法 每个应用程序请求的UserManager。
完整的例外文字:
创建模型时无法使用上下文。这个 如果在内部使用上下文,则可能抛出异常 OnModelCreating方法或者如果访问相同的上下文实例 并发多个线程。请注意DbContext的实例成员 和相关的类不保证是线程安全的。 “
答案 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;()