【问题标题】:Does the ASP.NET Identity Factory Pattern break the EntityFramework DbContext?ASP.NET 身份工厂模式是否破坏了 EntityFramework DbContext?
【发布时间】:2014-01-25 02:13:27
【问题描述】:

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

我收到的异常发生在以下调用中:

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

更大的博客上下文:

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

完整的异常文本:

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

【问题讨论】:

  • 如果是每个请求,你如何从多个线程访问它?
  • 我认为一个 ASP.NET 请求可以有多个线程。
  • VS2013 SPA 模板是一个很好的地方,可以从中抄写这些(文档不足)的东西。
  • @ShaunLuttin 可以,但前提是您(明确)在做一些并行工作
  • 很高兴知道。上面的等待代码是否没有明确地做并行工作?我不清楚 .NET 4.5.1 中的异步。

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


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

    我遇到了这个问题,原因是:

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

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

    正确: var userManager = context.Get()

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 2010-11-20
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多