Entity Framework Pitfalls: Migrations and DbContext Construction
If you want to create or apply a migration over a DbContext-derived context and your context doesn’t have a public parameterless constructor, it will fail. This happens with both .NET Framework and .NET Core: the problem is that the migrations framework has no way of knowing how to create the context so as to get information from it, the migrations framework actually instantiates it!
There are two ways to go around it:
-
Create a public parameterless constructor on your context;
-
Create a class that implements IDbContextFactory<T>, where the generic parameter is your DbContext-derived class.
Having a parameterless constructor is not always ideal, because you may need to pass something in, like a connection string, but you can do it just for executing migrations and them remove it again. Just make sure that the connection string in use is the right one.
As for the IDbContextFactory<T> approach, it’s quite simple:
public class BlogContextFactory : IDbContextFactory<BlogContext>
{
public BlogContext Create()
{
var connectionString = "get a connection string somehow";
return new BlogContext(connectionString);
}
}
Basically, you have to implement the Create method so as to return an instance of your context, doesn’t really matter how you instantiate it. The migrations API will find this class automatically.
If you don’t do any of this, you may get weird errors, like, “unable to find the DbContext”, which doesn’t really help much.
Another problem you may face is if you have multiple DbContexts, in that case, you have to tell migrations which one to use.
Update: in Entity Framework Core, the IDbContextFactory<T> interface's Create method takes a parameter of type DbContextFactoryOptions.