"使用ASP.NET标识创建模型时不能使用上下文"

Sha*_*tin 43 c# asp.net multithreading entity-framework asp.net-identity

当我们调用AccountApiController.Register()方法时,为什么会发生这种情况?

  • 什么是尝试使用上下文?
  • 什么是尝试创建上下文?
  • 我们该如何避免这种情况?
  • 我们如何调试这个?

"消息":"发生错误.",

"ExceptionMessage":"在创建模型时不能使用上下文.如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常.请注意DbContext的实例成员和相关的类不保证是线程安全的.",

"ExceptionType": "System.InvalidOperationException"

"堆栈跟踪":"

在System.Web.Http.ApiController.d__1.MoveNext()

---从抛出异常的先前位置开始的堆栈跟踪结束

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification(任务>任务)

在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"

Raf*_*cer 25

如果不正确,也可能发生此错误connectionString.检查是否connectionString有效(没有拼写错误等).

  • 谢啦!在我的情况下,连接字符串不正确. (4认同)

Sha*_*tin 24

问题是我们没有使用MS建议的工厂模式.

您可以使用Factory实现从OWIN上下文获取UserManager的实例....这是针对应用程序的每个请求获取UserManager实例的推荐方法.

结果,"同时上下文实例由多个线程访问",因为多个请求和线程共享一个DbContext.

以下是正确的.它为每次调用UserManagerFactory函数创建一个新的MyDbContext实例.

UserManagerFactory 
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));
Run Code Online (Sandbox Code Playgroud)

以下是不正确的.它看起来很相似,但不会为每次调用UserManagerFactory创建一个新实例.这是我们正在使用的,我们的网站打破了.

var userStore = new UserStore<IdentityUser>(new MyDbContext());                    
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;
Run Code Online (Sandbox Code Playgroud)

  • 我应该把它放在我的项目上?我使用Unity.Mvc作为依赖解析器.此外,我使用自己的UnityOfWork,我注入了一个共享给我所有存储库的DbContext. (6认同)