【问题标题】:Entity Framework bug? "Context changed" Error, even when not实体框架错误? “上下文已更改”错误,即使没有
【发布时间】:2014-06-09 10:24:17
【问题描述】:

我用我的 MVC 应用程序让自己陷入了一个奇怪的土拨鼠日场景。
除非我每次调试应用程序时都应用我的解决方法(在这个问题的后面):

支持“UsersContext”上下文的模型自 数据库已创建。考虑使用 Code First 迁移来更新 数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

我没有更改模型。

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

  1. Add-Migration WHATEVERNAME(进行空白迁移)
  2. 删除此迁移。
  3. 运行:更新数据库
  4. 重新编译并运行(现在没有错误)

注意事项:

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

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

注意:自动迁移不适合我的场景。

【问题讨论】:

  • 您能否提供更多关于它如何呈现的信息?因此,一旦您完成了步骤 1-4 并运行了该应用程序,它就可以正常工作了……然后,如果您停止并重新启动该应用程序,它会再次出错吗?还是只有重新编译并重新启动?
  • @demoncodemonkey 一旦停止并重新启动,问题就会再次出现。我会在问题中澄清这一点。
  • 您是否对迁移做了一些奇怪的事情?你能说明你是怎么打电话给Database.SetInitializer的吗?
  • 感谢@demoncodemonkey。我不调用 Database.SetInitializer,所以无论约定默认是什么。上下文更新后,第一次选择时的应用程序异常。

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


【解决方案1】:

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

  1. 停止并重新启动应用程序不应导致数据库过时。只有调试的时候吗?您是否尝试过在不调试的情况下运行应用程序?然后回收应用程序池并再次运行应用程序。

  2. 您是否有任何奇怪的构建后步骤会覆盖“bin”文件夹中的某些 DLL?

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

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

    然后

    update-database -verbose

  5. 暂时注释掉您应用的大部分内容以尝试找出原因。

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

希望这里的东西至少能给你一个想法。祝你好运!

【讨论】:

    【解决方案2】:

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

    AutomaticMigrationsEnabled = true; 进入新生成的 Configurations.cs 文件。

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

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

    【讨论】:

    • 感谢您的回答。虽然我可以理解为什么这会“解决”这个问题。自动迁移不适合此项目。
    【解决方案3】:

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

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

    我猜你是否搭建了支架,它只会进行这些更改 - 或者可能有一些你很久以前更改的东西由于某种原因还没有被“拾取”。

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多