【问题标题】:EF creates InitialCreate in MigrationHistory then migration is turned on & InitialCreate has a new MigrationId causing pending migration issueEF 在 MigrationHistory 中创建 InitialCreate 然后打开迁移 & InitialCreate 有一个新的 MigrationId 导致挂起的迁移问题
【发布时间】:2018-07-06 15:05:43
【问题描述】:

我有两个解决方案,一个没有迁移的基本解决方案(正在生产中,所以我无法擦除数据),现在我已经将其分支来设置迁移并进行一些模型更改。

首先我需要在分支解决方案(第二个解决方案)上设置迁移,以便我可以应用模型更改,所以我:

所以我删除了创建的数据库,因为我需要运行第一个解决方案来创建初始数据库设置(模拟实时)。

当我运行第一个解决方案时,它会在 MigrationsHistory 表中创建一个名为 InitialCreate (201807061432030_InitialCreate) 的条目,该条目是自动创建的。然后,我在第二个解决方案上运行 update-database,该解决方案很好地应用了我的模型更改,尽管它们在 InitialCreate MigrationId 中存在差异。

我的第二个解决方案中的迁移条目(按照它们的创建顺序和它们在解决方案中的顺序):
- 201807061257015_InitialCreate
- 201807061315294_InitialBlank
- 201807061323086_add_entity

运行第一个然后第二个解决方案后迁移历史表中的迁移条目:

1 | 201807061315294_InitialBlank
2 | 201807061323086_add_entity
3 | 201807061432030_InitialCreate

第二个解决方案运行良好,但是当我尝试添加任何数据时,我得到 System.InvalidOperationException: '支持 'Context' 上下文的模型自创建数据库以来已更改。考虑使用 Code First 迁移来更新数据库

我已尝试在第二个项目上创建另一个迁移,以确保它们没有未迁移的模型更改(它们不应该迁移),但我收到错误消息。 无法生成显式迁移,因为以下显式迁移处于待处理状态:[201807061257015_InitialCreate]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

我的问题:

  1. 如何解决 MigrationId 不匹配的问题?由于第一个解决方案没有打开迁移,当我打开它们时(在第二个解决方案中)它会创建一个新的 id。
  2. 异常 System.InvalidOperationException: 'The model backing the 'Context' 是否会因 MigrationId 不匹配而引发,或者谁能指出为什么会发生这种情况?我已经查看了这个错误,但我发现的解决方案似乎不起作用:
    • 删除迁移历史记录表并不好,因为由于客户数据,我无法在生产中执行此操作。
    • 我发现将 Database.SetInitializer(null); 添加到 global.asax 的另一个解决方案似乎没有任何区别。
  3. 为什么在迁移历史记录表中应用后,我的迁移顺序看起来会有所不同?

提前致谢!

【问题讨论】:

  • 请谨慎使用自动迁移。它们有时会引起偏头痛,不值得承受压力。根据我的经验,我禁用自动迁移,并在需要时简单地运行 Create Migration 命令。然后我可以在应用之前修改迁移的内容。请记住这一点。

标签: c# entity-framework migration entity-framework-migrations


【解决方案1】:

我不确定这是否可行,但我认为我可能需要手动删除第一个 InitialCreate 并编辑 db 条目以反映正确的 InitialCreate。基于这个 SO question,我刚刚找到了https://stackoverflow.com/a/13108243/3172635

不过这个星期一我得试试。

编辑:我首先尝试删除 _MigrationHistory 表中的 InitialMigration 条目,但这不起作用,因为它尝试再次应用 InitialMigrations,但由于表已经创建,所以不能。所以我所做的是更新 InitialMigration 条目的 MigrationId 以反映它在新项目中的内容。

我使用的sql: SET MigrationId='201807061257015_InitialCreate' WHERE MigrationId = '201807061432030_InitialCreate'

【讨论】:

  • 我阅读了您链接到的其他答案,我之前已经完成了该过程并且它确实有效。正是在我迁移历史的这段黑暗时期,我发现禁用自动迁移可能是最好的选择。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多