实体框架AND工具以与运行时不同的方式查看模型

时间:2014-02-07 10:24:46

标签: asp.net-mvc entity-framework asp.net-mvc-5.1

我正在使用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,并且它没有显示相同的行为,所以我正在寻找关于在我的主项目中寻找什么的指针,这可能会影响这个。

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

我已将我的代码还原为MVC5.0,这使问题暂时消失,但问题仍然无法理解或修复(我仍需要在某些时候更新到5.1!)。

2 个答案:

答案 0 :(得分:1)

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

  • 实体
  • 数据(DbContext& Configuration)
  • 网络应用

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

答案 1 :(得分:0)

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

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