我最近开始尝试移动由实体框架代码优先迁移(EF 5)支持的大型生产数据库。我正在使用代码优先迁移并启用自动迁移off
数据层正在内部Application_Start()
使用以下几行进行升级:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>(null));
using (var ctx = new MyDbContext()){
ctx.Database.Initialize(false);
}
在使用 SQL Management Studio 中的“部署到 SQL Azure”选项迁移数据库然后将我的应用程序指向它之后,我陷入了死循环,并出现以下错误:
无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。
这是个谎言!(或工作的错误错误):-)
在设置防火墙规则以允许我的本地 Visual Studio 实例连接然后运行update-database -verbose -script
后,我最终得到一个空白结果。
PM> update-database -verbose -script
Using StartUp project 'MyProject.Website'.
Using NuGet project 'MyProject.Data'.
Target database is: 'MyNewSQLAzureDB' (DataSource: tcp:xxxxxx.database.windows.net,1433, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
我开始发疯了。
我尝试过的事情:
- 使用SQL Azure SQL 提供程序
- 在我的本地数据库备份和 Azure 备份之间进行架构比较(表结构没有变化,尽管我假设索引已经改变)。
- 升级到 EF 6 以防旧模型中的模型元数据比较存在差异。
application_start()
以几种不同的方式进行迁移。
我认为这可能是一个错误,因为我的应用程序在移动之前使用相同的代码库超过 2 年,而对于问题所在,异常似乎很奇怪。
我认为可能发生的事情:
- SQL Azure 迁移工具更改了我的模型中的一些小事情(将聚集索引添加到所有内容。
- EF DBMigrator 的架构比较部分将这些更改视为架构中的差异,但不是抛出 a
DbEntityValidationException
,而是抛出AutomaticMigrationsDisabledException
异常数据中没有列出模型差异的 a。
有人有想法么?有没有办法捕获新模型并_migrationhistory
手动更新表格以使世界再次成为一个快乐的地方?