6

我正在使用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()返回已应用于数据库的正确迁移列表。

4

3 回答 3

4

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

config.MigrationsAssembly = Assembly.GetAssembly(typeof([One of your migration classes]));
config.MigrationsNamespace = "[Namespace containing your migrations]";
于 2014-06-23T00:33:40.557 回答
4

我也有同样的问题,经过一周的研究和阅读 .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是抽象的,它位于另一个程序集中。UpdateDatabaseToLatestVersion从每个 DbContext调用时,var type = GetType();返回继承的 DbContext 类型。

于 2016-03-29T14:00:05.867 回答
-1

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

这是有关如何在 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);
}
于 2019-12-18T14:58:35.463 回答