Fixing InvalidOperationException No database provider has been configured for this DbContext.

I had an odd error popup on my when building a website recently in ASP.Net Core 1.0 using EF core 1.0. It happened when I deleted an OnConfiguring method that I thought I no longer needed.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
	// I had my connection string being set up here
	optionsBuilder.UseSqlServer("mycoonection string was here");

I got the error: InvalidOperationException: No database provider has been configured for this DbContext. Which confused me because I was inserting the connection string when I established the database in my startup.cs file.

services.AddDbContext(options => options.UseSqlServer(connection)); 

Trying to dig into the issue further I also deleted a default constructor that I had because I reasoned, why should I have a default constructor when I only initialise the context with dependency injection which doesn't use the default constructor. I deleted it in case this was the issue. I then got this error:

ArgumentException: Context does not have a default constructor.

How weird. What the hell is constructing this method. I dug into the stack trace but it was full of system calls that I didn't recognise, but it looked like it was being initialized by something outside the code I'd written.

After 20 or so minutes I found the error. For some reason a few commits previous I had mistakenly added the Context Object to the Signature of my Index controller. It shouldn't have been passed in In fact I should have been referencing the context object on the Controller class.

public IActionResult Index(PersonalSiteContext context)
        var overview = Services.Content.FetchOverview(context);
        return View(overview);           

So I corrected it and my bug went away.

public IActionResult Index()
        var overview = Services.Content.FetchOverview(this.context);
        return View(overview);           

Lastly I added my dependency injection where it should have been, the class Constructor:

private IMemoryCache memoryCache;
private PersonalSiteContext context;

public HomeController(IMemoryCache memoryCache, PersonalSiteContext context) {
        this.memoryCache = memoryCache;
        this.context = context;

Hope this ends up helping someone.

Published by thebeebs

Martin works for Microsoft as a Software Developer. He’s been a developer since the late 90s and loves figuring out problems and experimenting with code.