DbMigrator.GetPendingMigrations() always empty

2019-06-18 19:56发布

问题:

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.

回答1:

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]";


回答2:

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.