“Context cannot be used while the model is being created” exception with ASP.NET Identity

Why is this happening when we make a call to the AccountApiController.Register() method?

  • what is trying to use the context?
  • what is trying to create the context?
  • how do we avoid this?
  • how do we debug this?

“Message”:”An error has occurred.”,

“ExceptionMessage”:”The context cannot be used while the model is
being created. This exception may be thrown if the context is used
inside the OnModelCreating method or if the same context instance is
accessed by multiple threads concurrently. Note that instance members
of DbContext and related classes are not guaranteed to be thread
safe.”,

“ExceptionType”:”System.InvalidOperationException”,

“StackTrace”:”

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

— End of stack trace from previous location where exception was thrown

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

at System.Runtime.CompilerServices.TaskAwaiter
.HandleNonSuccessAndDebuggerNotification(Task > task)

at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()”

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The problem was that we were NOT using the factory pattern that MS recommends.

You can use Factory implementation to get an instance of UserManager
from the OWIN context. … This is a recommended way of getting an instance of
UserManager per request for the application.

As a result, “the same context instance is accessed by multiple threads concurrently,” because several requests and thus threads shared a DbContext.

This following is correct. It creates a new instance of MyDbContext for each call to the UserManagerFactory function.

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

The following is incorrect. It look similar but does not create a new instance for each call to UserManagerFactory. It is what we were using, ergo our site broke.
var userStore = new UserStore<IdentityUser>(new MyDbContext());                    
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;

Method 2

This error can also occur in case of incorrect connectionString. Check if connectionString is valid (no typo etc.).

Method 3

Do you override the OnModelCreating method? If so, can you share it or the whole context class?

If not, you should pay attention to the following in the error message

or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.

If that doesn’t help, do you use an unchanged Web API project which is created by Visual Studio?

Method 4

TL&DR: If the goal is model seeding, and you are using the entity framework, i strongly suggest you take a look at the following link:
https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding

This link details how to directly SEED your data, during the migration itself. This is typically useful when you want to seed your data during the creation of the DATABASE instead of the start of your application.

Method 5

If you are getting records from Table/View make sure you have sufficient access on the DB objects.

I had the same problem and i resolved it by executing

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


sp_change_users_login 'update_one' 'dbuser' 'dblogin'

Find more snippet and details

Method 6

I’m using EF Code First in a multi-layered architecture with MySQL and had the same exception and using the following line inside the DBContext Class constructure works:

Database.SetInitializer<EntitiesName>(null);

Method 7

I agree with the main Answer by Shaun Luttin but also,

In my case: after the deployment i take this error and i found the reason is using the Hsts Preload after inserting SSL certificate. Uncommenting this lines solved the redirection, and it solved this error completely

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x