DbMigrator.GetPendingMigrations()始终为空

时间:2012-09-10 13:53:48

标签: entity-framework ef-code-first migration dbmigrator

我正在使用DbMigrator类来获取待处理迁移的列表。由于某种原因,即使存在待定迁移,它也不会返回任何项目。我错过了一步吗?

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());

我认为它可能是连接字符串,但有趣的是migrator.GetDatabaseMigrations()返回已应用于数据库的正确迁移列表。

3 个答案:

答案 0 :(得分:4)

同样的事情发生在我身上,原因是我在一个不同的集会中工作。在这种情况下,您需要指定包含迁移的程序集和命名空间:

config.MigrationsAssembly = Assembly.GetAssembly(typeof([One of your migration classes]));
config.MigrationsNamespace = "[Namespace containing your migrations]";

答案 1 :(得分:2)

我也有同样的问题,经过一周的研究和阅读.Net源终于找到了解决方案。 如果您使用不同的程序集,则可以完全按照以下方式设置配置程序集信息:

    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();
     }

此代码位于DbContextBase类中,我项目中的所有DbContext都继承DbContextBaseDbContextBase是抽象的,它位于另一个程序集中。从每个DbContext调用UpdateDatabaseToLatestVersion时,var type = GetType();返回继承的DbContext类型。

答案 2 :(得分:0)

在实体框架核心中尝试解决此问题时,我遇到了他的问题。发布我如何修复它,以防其他人也随机遇到此问题以尝试解决此问题。

这是有关如何在EF Core中修复此问题的解决方案。

我将此扩展方法添加到了我的代码中

public static IApplicationBuilder MigrateDatabase(this IApplicationBuilder app, IServiceScopeFactory scopeFactory)
{
    using (var scope = scopeFactory.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        db.Database.EnsureCreated(); // this was my problem. If the database was missing, then the migrations were never applied.

        var migrations = db.Database.GetPendingMigrations();
        if (migrations.Any())
            db.Database.Migrate();
    }

    return app;
}

然后我在Startup.cs中将其命名为

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceScopeFactory scopeFactory)
{
    // other things here
    app.MigrateDatabase(scopeFactory);
}