【问题标题】:Entity Framework Migrations "context has changed" error persists even after reset all migrations即使重置所有迁移后,实体框架迁移“上下文已更改”错误仍然存​​在
【发布时间】:2015-01-04 09:38:23
【问题描述】:

我有一个包含两个项目的解决方案,主要有用户类(MVC5 的默认值),另一个我有我的业务类。

对我的代码进行一些更改后,我得到了错误:

支持“EfDbContext”上下文的模型在创建数据库后发生了变化。考虑使用 Code First 迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

我已经执行了添加新迁移和更新数据库的命令。错误仍然存​​在。

在这之后我尝试了很多方法来解决这个问题,包括这些解决方案:

https://stackoverflow.com/a/22451879/2394172

https://stackoverflow.com/a/11679386/2394172

但我仍然有这个错误:

PS:我已经删除了我的数据库并重新创建它,但问题仍然存在。

我不明白为什么这个错误仍然发生。当我执行命令Add-Migration 时,创建的文件的功能为空白。

更新(2014 年 12 月 11 日):

我制作了一个视频,展示了我正在尝试的所有过程,证明我使用的是我通过迁移更新的同一个数据库。

http://youtu.be/hNVG10NynZU

顺便说一下,我注意到我可以在数据库中插入数据,如视频所示,但插入后出现错误。

【问题讨论】:

  • 您是否尝试过使用空白文件进行迁移?有时这样做只会让 EF 重新开始工作。
  • 我肯定已经这样做了。
  • 您是从包管理器还是使用流体 api OnModelCreating 配置迁移?
  • @DaveAlperovich 我使用了“OnModelCreating”来删除自动复数。在 nugget 包管理器中,我只运行命令 Enable-Migrations。
  • 从 Nuget 设置迁移是推荐的方式,但我发现它模棱两可且有问题。尝试在模型基类中设置迁移:public ResumeContext() : base("name=ResumeContext") { this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false; this.Configuration.AutoDetectChangesEnabled = true; Database.SetInitializer( new MigrateDatabaseToLatestVersion<ResumeContext, ResumeMigrationsConfiguration>()); }

标签: entity-framework asp.net-mvc-5 entity-framework-migrations


【解决方案1】:

如果您不关心现有数据,那么以下方法肯定会起作用:

  1. 扔掉你的数据库
  2. 扔掉所有的迁移文件
  3. 运行add-migration
  4. 运行update-database

这有点像压路机,但如果你对找出问题的真正原因不感兴趣,它会让你摆脱麻烦。

【讨论】:

  • 感谢您的回答,但我已经做到了。错误仍然存​​在。
  • 如果我关心我现有的数据,我怎样才能找到错误的根源?备份后我删除了我的数据库。
  • 确保您针对的项目与您正在查看浏览器的项目相同,并且您希望该项目使用的数据库就是它正在使用的数据库。
  • @ChrisPratt 肯定是同一个。
  • 我很难相信您这样做了,您正在查看您对其执行迁移的数据库,并且问题仍然存在。如果这确实是真的,那是 EF 中的一个错误,但我有疑问。
【解决方案2】:

您的代码在对 CreateDatabaseIfNotExists...InitializeDatabase 的内部调用失败 - 出于某种原因,您的应用程序认为数据库不存在并试图从您的模型代码中创建它。您对 ASPNet Identity 表和您的专有表使用相同的数据库;当您第一次尝试访问专有表 (Cms) 中的数据时,您会遇到异常。

可能为 ASPNet 表使用不同的数据库名称,因此它们不在 CMS 数据库中。

或者,由于您在包管理器控制台中使用迁移来创建/更新您的架构,因此不要使用 CodeFirst 数据库初始化程序功能。在 EfDbContext 的构造函数中,将 null 传递给 Database.SetInitializer() 方法,以防止在首次访问时尝试初始化数据库。代码示例见此链接:

http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx.

【讨论】:

  • 我尝试了这两种解决方案,但都没有成功...还是谢谢。
【解决方案3】:

不确定,但是 在启用迁移或添加迁移时尝试使用 -projectName。 我记得在解决方案中运行多个项目的迁移时遇到了一些问题。 我记得在某处读到他们使用 Set as StartUp 项目或类似的想法。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多