切换到新上下文后,EntityFramework迁移变得无用.DbMigrator正在使用来自第一个数据库实例的Pending Migrations列表,这意味着没有迁移应用于其他数据库,然后在Seed()期间导致错误;
在Application Start上,我们有自定义Db初始化来创建和更新数据库.CreateDatabaseIfNotExists按预期工作,新数据库应用了所有迁移.但是,MigrateDatabaseToLatestVersion初始化程序和我们的自定义程序都无法更新列表中第一个以外的数据库.
foreach (var connectionString in connectionStrings)
{
using (var context = new ApplicationDbContext(connectionString))
{
//Create database
var created = context.Database.CreateIfNotExists();
var conf = new Workshop.Migrations.Configuration();
var migrator = new DbMigrator(conf);
migrator.Update();
//initial values
conf.RunSeed(context);
}
}
Run Code Online (Sandbox Code Playgroud)
context.Database.CreateIfNotExists(); 工作正常.migrator.GetLocalMigrations() 总是返回正确的值.migrator.GetPendingMigrations() 在第一个数据库返回空列表后.migrator.GetDatabaseMigrations() 是挂起的迁移的镜像,在第一个数据库之后它包含空数据库的完整列表事件.context.xxx.ToList()从Db实例获取data()确认连接已启动并正常工作,并链接到正确的实例.强制更新到最近的迁移,migrator.Update("migration_name");不做任何更改.从我通过阅读EF源代码收集的内容中,它自己检查挂起的迁移列表,这会给它带来错误的结果.
似乎有一些缓存在幕后,但它让我无法重置它.
有没有办法在多个数据库上执行迁移,还是EF中的另一个"设计错误"?
编辑:
真正的问题是DbMigrator为自己的用途创建新的Context.它是通过默认的无参数构造函数来实现的,在我的例子中,它有回退到默认(第一个)连接字符串web.Config.
我没有看到这个问题的好解决方案,但在我的情况下原始的解决方法是临时编辑默认连接字符串:
var originalConStr = WebConfigurationManager.ConnectionStrings["ApplicationDbContext"].ConnectionString;
var …Run Code Online (Sandbox Code Playgroud)