【问题标题】:DbMigrator trying to execute every migration, not detecting executed migrationsDbMigrator 尝试执行每个迁移,而不是检测已执行的迁移
【发布时间】:2016-04-26 10:34:58
【问题描述】:

我正在尝试创建一个服务调用,它将 EF 代码优先数据库更新到最新版本。但是,它总是尝试(并且显然失败)执行所有迁移,无论它们是否已经执行。

这是我的代码:

        var config = new DbMigrationsConfiguration<MyContext>();
        config.MigrationsAssembly = typeof (MyContext).Assembly;
        config.MigrationsNamespace = "Context.Migrations";

        //This had no effect
        //config.SetHistoryContextFactory(connectionString.ProviderName, (connection, s) => new HistoryContext(context.Database.Connection, "dbo"));
        var migrator = new DbMigrator(config);

        //This gets every single migration, even the ones already executed before
        var migrations = migrator.GetPendingMigrations();
        //This gets 0 migrations
        var existing = migrator.GetDatabaseMigrations();
        //This gets all migrations
        var other = migrator.GetLocalMigrations();

        //This returns true! So it knows all the migrations are already executed
        var differ = context.Database.CompatibleWithModel(true);
        //This will throw an exception because it's trying to create existing tables!
        migrator.Update();

我可以确认迁移历史记录表包含 [dbo]。[__MigrationHistory] ​​引用了所有旧迁移。

我检查了迁移器中的连接字符串。我还尝试手动设置历史上下文工厂,以防它在其他地方寻找没有结果。此外,直接从控制台运行 update-database 可以正常工作,并且没有挂起的更新。

感谢任何帮助

【问题讨论】:

    标签: entity-framework entity-framework-migrations


    【解决方案1】:

    如果您的数据库已全部更新,并且您不需要旧的迁移表,那么我建议您删除迁移文件夹并使用重新创建它

      enable-migrations
    

    当迁移出现问题时,我总是这样做。我从不需要历史迁移——一旦他们完成了他们的工作——他们就完成了!如果您正在查看配置,请务必保存您的种子方法。你可以看看我之前的帖子,也许这也会有所帮助。

    Migrations

    祝你好运。

    【讨论】:

    • 感谢您的回答 - 我们总是设置同一个数据库的新实例,因此不能删除旧迁移
    • 修改数据库后,当您再次启用迁移时,新实例将设置为最后一个形状。启用迁移时,迁移会为您提供具有最后最终数据形状的脚本,使用该脚本设置同一数据库的新实例。这就像运行所有历史旧脚本的最终快照。你会得到你的最终数据库。然后重新开始开发并添加。
    • "If your database is all updated" :提问者的问题是数据库可能没有更新。
    【解决方案2】:

    确保DbMigrationsConfiguration.ContextKey 设置正确。

    此行后面的默认值

    var config = new DbMigrationsConfiguration<MyContext>();
    

    会是这样的

    "System.Data.Entity.Migrations.DbMigrationsConfiguration`1[MyContextNamespace.MyContext]"
    

    您需要添加以下行

    config.ContextKey = "{Your_Context_Key}";
    

    如果您不知道上下文键,请打开 [dbo].[__MigrationHistory] 表并查看 ContextKey 列。

    正确设置后,如果您的数据库是最新的,migrator.GetPendingMigrations() 应该返回空,migrator.GetDatabaseMigrations() 应该返回所有迁移。

    【讨论】:

    • 就是这样!当我获准批准时,您的积分将在约 21 小时内送达。
    • Tbh 我已经放弃并改变了我的整个程序。非常感谢!
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多