Entity framework DbMigrator正在尝试执行每个迁移,但未检测到已执行的迁移

Entity framework DbMigrator正在尝试执行每个迁移,但未检测到已执行的迁移,entity-framework,entity-framework-migrations,Entity Framework,Entity Framework Migrations,我正在尝试创建一个服务调用,该调用将EF code first数据库更新为最新版本。然而,它总是试图(显然是失败的)执行所有迁移,不管它们是否已经执行过 这是我的密码: var config = new DbMigrationsConfiguration<MyContext>(); config.MigrationsAssembly = typeof (MyContext).Assembly; config.MigrationsName

我正在尝试创建一个服务调用,该调用将EF code first数据库更新为最新版本。然而,它总是试图(显然是失败的)执行所有迁移,不管它们是否已经执行过

这是我的密码:

        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();
var config=new dbmigtorinsconfiguration();
config.migrationassembly=typeof(MyContext).Assembly;
config.migrationnamespace=“Context.Migrations”;
//这没有效果
//config.SetHistoryContextFactory(connectionString.ProviderName,(connection,s)=>newHistoryContext(context.Database.connection,“dbo”);
var migrator=新的DbMigrator(配置);
//这将获得每一次迁移,甚至是之前已经执行的迁移
var migrations=migrator.GetPendingMigrations();
//这将获得0次迁移
var existing=migrator.GetDatabaseMigrations();
//这将获得所有迁移
var other=migrator.GetLocalMigrations();
//这是真的!因此,它知道所有迁移都已执行
var different=context.Database.CompatibleWithModel(true);
//这将引发异常,因为它正在尝试创建现有表!
migrator.Update();
我可以确认迁移历史记录表包含[dbo]。[uuu MigrationHistory]引用了所有旧迁移

我在migrator中检查了连接字符串。我还尝试手动设置历史上下文工厂,以防它在其他地方查找时没有结果。另外,直接从控制台运行更新数据库也可以工作,并且表示没有挂起的更新


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

  enable-migrations
我总是在迁移失败时这样做。我从不需要历史性的迁移——一旦他们完成了他们的工作——他们就完成了!如果正在查看配置,请确保保存种子方法。你可以看看我之前关于这个的帖子,也许这也会有帮助

祝你好运。

确保设置正确

此行后的默认值

var config = new DbMigrationsConfiguration<MyContext>();
您需要添加以下行

config.ContextKey = "{Your_Context_Key}";
如果您不知道上下文键,请打开
[dbo].\uu MigrationHistory]
表并查看
ContextKey


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

感谢您的回答-我们始终在设置同一数据库的新实例,因此,删除旧迁移不是一个选项一旦您修改了数据库,新实例将被设置为再次启用迁移时的最后一个形状。启用迁移时,迁移会为您提供一个带有最后一个最终数据形状的脚本,请使用该脚本设置同一数据库的新实例。这就像运行所有历史旧脚本的最终快照一样。您将获得最终的数据库。然后重新开始开发并添加到其中。“如果你的数据库都更新了”:询问者的问题是数据库可能没有更新。就是这样!您的积分将在21小时内到达,我将被允许批准。Tbh我已经放弃并改变了我的整个程序。非常感谢!
config.ContextKey = "{Your_Context_Key}";