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”>()