2

我最近开始尝试移动由实体框架代码优先迁移(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手动更新表格以使世界再次成为一个快乐的地方?

4

2 回答 2

2

AutomaticMigrationsDisabledException这里绝对是误导。

我相信这篇文章可能会帮助您解决问题。http://www.diaryofaninja.com/blog/2013/12/05/sorrow-and-elation-ndash-why-reflection-isnt-always-your-friend

建议在服务器上运行 fuslogvw ( http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx ) 以找出您的网站难以找到的程序集。

这可能只是让您的 nuget 包同步的问题。

于 2014-05-20T13:17:02.443 回答
1

造成这种情况的实际原因是我的数据层中缺少依赖项。

我的实体框架域 POCO 在某些属性上有 Json.Net 属性。

由于属性使用反射运行,并且静默失败,因此抛出的异常与最终结果无关。

正如亚历克斯在他的回复中提到的,我在这里写了关于解决这个问题的博客:

http://www.diaryofaninja.com/blog/2013/12/05/sorrow-and-elation-ndash-why-reflection-isnt-always-your-friend

正如他在评论中所说,解决此问题的方法是打开 Fusion Logging。可悲的是,当时的不断AutomaticMigrationsDisabledException让我在一个完全不同的地方寻找。

这个故事的寓意可能是:当您在寻找问题时遇到死胡同时,添加融合记录作为贯穿步骤。

于 2014-05-20T17:33:14.963 回答