0

我正在使用具有显式(非自动)代码优先迁移的 EntityFramework 6.0.2。我的模型已经很成熟了——我已经使用这个应用程序几个月了,并且添加了许多迁移。该应用程序使用 MVC5。

升级到 MVC5.1 后,我现在处于 VS 中的 EF 迁移工具看到模型与运行时不同的情况。运行Add-Migration会创建一个空迁移,并Update-Migration认为所有未完成的迁移都已应用。但是,当尝试启动该站点时,它会失败并显示AutomaticMigrationsDisabledException

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

这似乎与我的模型类中的元素有关,这些元素同时具有[Required][AllowHtml]设置了它们。这些不是新属性,但我在更新到 MVC5.1 后创建的第一个显式迁移导致重新创建具有这两个属性的任何属性,而不是 NOT NULL。这是我开始注意到问题的时候,因为这是我无法再运行我的应用程序的时候。

我不想删除该[AllowHtml]属性。我想找出为什么 Visual Studio 工具对模型的看法与运行时不同。我使用 MVC5.0 创建了一个简单的测试项目,将其升级到 5.1,但它没有显示相同的行为,所以我正在寻找关于在我的主项目中寻找可能会影响这一点的内容的指针。

还有另一个问题有类似的问题,但与 MVC5.1 无关,这表明这可能与某处的版本差异有关。我的应用程序中的所有许多程序集都引用了所有外部依赖项的相同版本,例如 MVC 和 EF。

我已将我的代码恢复为 MVC5.0,这使问题暂时消失了,但问题仍然既不被理解也不修复(我仍然需要在某个时候更新到 5.1!)。

4

2 回答 2

1

事实证明,这个问题是由于我的项目结构造成的。我有多个程序集,但简化它最终是:

  • 实体
  • 数据(DbContext 和配置)
  • 网络应用

这些不在同一个解决方案中,并且从中央构建输出文件夹中引用。问题是实体项目引用了 MVC(为了使用[AllowHtml]),但数据项目没有。当 Visual Studio 工具在数据项目中运行以创建迁移时,它没有看到 MVC。但是,由于迁移是从具有 MVC 的 Web 项目运行的,这导致了不同的行为。

于 2014-03-19T10:25:38.227 回答
0

Entity Framework 有一个系统表,用于跟踪已应用的迁移以及每个迁移的数据库状态的哈希表示。问题是由于某种原因这里存在不匹配。这有点 hacky,但最简单的解决方法实际上是继续应用那个空迁移。EF 将使用当前状态更新它使用的系统表,然后它会再次认为一切正常。

我从来没有在生产中亲自遇到过这个问题,但在开发过程中我遇到过几次,不幸的是,我从来没有找到更好的解决方案,除了炸毁数据库并让它重新创建它. 对于生产中的某些东西,这显然不是一个真正可以接受的解决方案。

于 2014-02-07T15:54:47.347 回答