gpt4 book ai didi

entity-framework - DbMigrator 尝试执行每个迁移,而不是检测已执行的迁移

转载 作者:行者123 更新时间:2023-12-05 00:20:14 24 4
gpt4 key购买 nike

我正在尝试创建一个服务调用,它将 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 可以工作,并表示没有挂起的更新。

任何帮助表示赞赏

最佳答案

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

关于entity-framework - DbMigrator 尝试执行每个迁移,而不是检测已执行的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com