I'm using the DbMigrator
class to get a list of pending migrations. For some reason it returns no items even though there are pending migrations. Am i missing a step?
var configuration = new Migrations.Configuration();
configuration.TargetDatabase = new DbConnectionInfo("MyDatabase");
var migrator = new DbMigrator(configuration);
var migs = migrator.GetPendingMigrations().ToList();
Console.WriteLine(migrator.GetPendingMigrations().ToString());
I thought it might be the connection string but what's interesting is that migrator.GetDatabaseMigrations()
returns the correct list of migrations already applied to the db.
The same happened to me and the reason was that I was working in a different assembly. In that case, you need to specify the assembly and namespace that contains your migrations:
config.MigrationsAssembly = Assembly.GetAssembly(typeof([One of your migration classes]));
config.MigrationsNamespace = "[Namespace containing your migrations]";
I have same problem too, and after a week of research and read .Net source finally find solution.
If you working in a different assembly, you mus set configuration assembly information completely like this:
public void UpdateDatabaseToLatestVersion()
{
var configuration = new DbMigrationsConfiguration();
var type = GetType();
configuration.MigrationsAssembly = type.Assembly;
configuration.TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient");
configuration.MigrationsNamespace = type.Namespace + ".Migrations";
configuration.ContextKey = type.Namespace + ".Migrations.Configuration";
configuration.ContextType = type;
var migrator = new DbMigrator(configuration);
migrator.Update();
}
This code is in DbContextBase
class, All DbContext
in my project inherit DbContextBase
. DbContextBase
is abstract and it is located in another assembly. When called UpdateDatabaseToLatestVersion
from each DbContext, var type = GetType();
return inherited DbContext type.