Simple Steps to Fix DBContext Error: A second operation started on this context before a previous operation completed. – Windows ASP.NET Core Hosting 2020 | Review and Comparison

Simple Steps to Fix DBContext Error: A second operation started on this context before a previous operation completed.

I have found this issue on Stackoverflow forum. Previously I had encountered this issue and able to fix this issue. I hope this tutorial can help you to fix your issue.

Problem

When you deployed your application, Entity Framework Core runtimes gives below error:

A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however, instance members are not guaranteed to be thread-safe.

The issue might found on Asp.net Core 3.1 or lower version of .NET Core.

How to Solve the Issue

This error I found to be due to a concurrency issue associated with DBContext.

Please note that the DBContext object is not thread-safe.

Its the implementor’s responsibility to implement the concurrency while using.

If using ASP.NET Core

  • Use DbContext using a dependency injection Container(Recommended).
  • Add the DbContext type to the service container by using the AddDbContext method with Scoped lifetime (Recommended ).

Update Startup.cs as below,

services.AddDbContext<EmployeeContext>(options =>
    {  
      options.UseSqlServer(Configuration.GetConnectionString("EmployeeDB");
    }

Make sure to use scoped DBContext objects Using AddDbContext(..) to ensure that you are registering the DBCOntext as Scoped. i.e every new request will use the new service instance and hence the new DBContext.

Using a Repository for DBContext?

If the repository is being used for DI DBContext , then it’s important that the Repository instance is also Scoped lifetime in the API pipeline container.

Sometimes many other coding issues could also cause this issue.

If using Asynchronous operation ?

Please make sure to await all your Asynchronous call.

Asynchronous methods without await could lead to database access in a non-blocking way thereby may cause synchronization issues. 

Example:

[HttpGet("{id}")]
public async Task<IActionResult> OnGetAsync(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
 
    EmployeeDb db = await _employeeContext.EmployeeDb.FindAsync(id);
 
    if (db == null)
    {
        return NotFound();
    }
    return Ok(db);
}

If using .NET Core Console or Form app

If using .NET Core console or Forms app similar approach can be followed.

Please register the DBContext as scoped by calling AddDbContext as below,

var builder = new HostBuilder()
               .ConfigureServices((hostContext, services) =>
               {
 
                    services.AddLogging(configure => configure.AddConsole())
                    .AddTransient<MyApplication>()
                    .AddDbContext<EmployeeContext>(options =>
                    {
                        options.UseSqlServer("Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;");
                    });
               })

Summary

I hope that tutorial above can help to fix your issue. Maybe any insight? Please let me know. Thank you for reading!