实体框架错误? “上下文已更改”错误,即使没有

时间:2014-06-09 10:24:17

标签: asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-6 ef-migrations

我已经进入了一个奇怪的土拨鼠日场景,其中包含了我的MVC应用程序 除非我在每次调试应用程序时都应用我的解决方法(本问题的后面部分),否则我会出现此错误:

  

支持' UsersContext'自从以来情境发生了变化   数据库已创建。考虑使用Code First Migrations进行更新   数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

我没有更改模型。

我的解决方法工作流程是:

  1. 添加迁移WHATEVERNAME(进行空白迁移)
  2. 删除此迁移。
  3. 运行:Update-Database
  4. 重新编译&运行(现在没有错误)
  5. 注意:

    • 脚本和数据库中最新迁移匹配的__MigrationHistory哈希值。
    • 我有我的MVC应用程序& EF项目作为单独的项目。
    • 我尝试过创建-IgnoreChanges迁移,看看是否应用此功能可以缓解此问题。它没有。

    这非常令人沮丧,我将如何永久解决这个问题?

    注意:自动迁移不适合我的方案。

3 个答案:

答案 0 :(得分:1)

嗯,如果不了解更多细节,几乎不可能理解错误。所以我所能做的就是给你一些你可以尝试的线索。

  1. 停止并重新启动应用程序不应导致数据库过时。是仅在调试时?您是否尝试过运行应用程序而无需调试?然后回收应用程序池并再次运行该应用程序。

  2. 你有任何奇怪的后期构建步骤,将覆盖你的" bin"文件夹?

  3. 您的应用是否正在执行更改数据库架构的操作,从而在您下次启动时使其无效?运行SQL事件探查器以检查应用程序启动时数据库发生的情况。

  4. 迁移回您的架构的第一个版本,然后再返回(首先备份您的数据库):
    update-database -TargetMigration:0 -verbose

    然后

    update-database -verbose

  5. 暂时将大部分应用注释掉,以试图找出原因。

  6. 使用EF以相同方式配置创建一个全新的应用程序,复制连接字符串并查看是否发生了这种情况。如果没有,那么肯定会有不同的东西。如果是,请告诉我们您的EF设置。

  7. 希望这里有些东西可以给你一个至少一个想法。祝你好运!

答案 1 :(得分:0)

启用迁移会设置整个迁移系统。但要启用自动迁移,您必须包含 - EnableAutomaticMigrations ,只需添加行

AutomaticMigrationsEnabled = true;   到新生成的Configurations.cs文件中。

与数据库初始化程序结合使用,可以更加简化开发周转,因为每次进行更改时都不必再键入add-migration和update-database。这将自动发生。但是,这还不够,如果你想要删除列,你还必须执行第3步,支持自动数据丢失。

当您准备发布需要严格版本控制的软件(内部或外部)并在现场升级数据库时,您应该删除自动迁移并添加手动迁移点。

答案 2 :(得分:0)

更新到EF6时会发生这种情况,这会对_MigrationHistory表(https://msdn.microsoft.com/en-us/data/jj591621)进行架构更改

EF6版本有一个新列ContextKey,因此迁移可能会尝试添加该列。

我猜测你是否支持它只会做出这些改变 - 或者很久以前你曾经改变过的那些东西并没有被提起来#39;但由于某种原因。

如果你现在不想处理它,你可以disable migrations temporarily

 System.Data.Entity.Database.SetInitializer<UsersContext>(null);