DbMigrator尝试执行每次迁移,而不是检测已执行的迁移

时间:2016-01-20 14:16:21

标签: entity-framework ef-migrations

我正在尝试创建一个服务调用,将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工作,并且没有待处理的更新。

感谢任何帮助

2 个答案:

答案 0 :(得分:6)

确保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()应该返回所有迁移。

答案 1 :(得分:-1)

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

重新创建它。
  enable-migrations

当迁移陷入困境时,我会一直这样做。我从不需要历史性的迁移 - 一旦他们完成了工作 - 他们就完成了!如果您看到配置,请务必保存种子方法。你可以看看我之前的帖子,也许这也会有所帮助。

Migrations

祝你好运。