"Context cannot be used while the model is being created" ASP.NET 标识的例外



当我们致电coundlopicontroller.register()方法时,为什么会发生这种情况?

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

"消息":"发生了错误。",

" exceptionMessage":"模型为 被创建。如果使用上下文,可能会抛出此例外 在on ModelCreating方法或同一上下文实例中 由多个线程同时访问。请注意实例成员 dbContext和相关类别不能保证为线程 安全。",

" exceptionType":" system.invalidoperationException",

" stacktrace":"

在system.web.http.apicontroller.d__1.movenext()

---堆栈跟踪的结束来自以前的位置,该位置被抛出了

在system.runtime.com.pilerservices.taskawaiter.throwfornonsuccess(任务任务)

在system.runtime.com.pilerservices.taskawaiter 。

在system.web.http.dispatcher.httpcontrollerdispatcher.d__0.movenext()"

问题是我们不使用MS推荐的工厂模式。

您可以使用工厂实施来获取UserManager的实例 从Owin上下文。...这是获得实例的推荐方法 usermanager根据该应用程序的请求。

结果是,"同一线程同时访问了相同的上下文实例",因为多个请求和线程共享了dbcontext。

以下是正确的。它为每个调用的usermanagerFactory函数创建了一个新实例。

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

以下是不正确的。它看起来相似,但并未为每个调用usermanagerFactory创建一个新实例。这是我们正在使用的,我们的网站破裂了。

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

在不正确的connectionString的情况下,此错误也可能发生。检查connectionString是否有效(没有错别字等)。

您是否覆盖了on ModeLcreating方法?如果是这样,您可以分享它还是整个上下文类?

如果没有,您应该注意错误消息中的以下内容

或如果多个线程同时访问相同的上下文实例。请注意,DBContext的实例成员和相关类的成员不能保证线程安全。

如果这无济于事,您是否使用Visual Studio创建的不变的Web API项目?

tl&amp; dr :如果目标是模型播种,并且您正在使用实体框架,我强烈建议您查看以下链接:https://learn.microsoft.com/en-us/ef/core/modeling/data-seeding

此链接详细介绍了如何在迁移本身期间直接播种数据。当您想在创建数据库而不是应用程序开始时要播种数据时,这通常很有用。

如果从表/视图中获取记录,请确保在DB对象上有足够的访问。

我有同样的问题,我通过执行

解决了它
sp_change_users_login [ @Action = ] 'action' [ , [ @UserNamePattern = ] 'user' ] [ , [ @LoginName = ] 'login' ] [ , [ @Password = ] 'password' ] [;]

sp_change_users_login 'update_one' 'dbuser' 'dblogin'

查找更多片段和详细信息

我首先在具有MySQL的多层体系结构中使用EF代码,并且具有相同的例外,并且在DBContext类构造中使用以下行工作:

Database.SetInitializer<EntitiesName>(null);

我同意 shaun luttin 的主要答案

在我的情况下:部署后,我犯了此错误,因此我发现插入SSL证书后使用HSTS预加载。删除该线路解决了重定向,它完全解决了此误差

 //app.UseHsts(options => options.MaxAge(days: 18 * 7).IncludeSubdomains().Preload());

最新更新