【发布时间】:2018-07-06 15:05:43
【问题描述】:
我有两个解决方案,一个没有迁移的基本解决方案(正在生产中,所以我无法擦除数据),现在我已经将其分支来设置迁移并进行一些模型更改。
首先我需要在分支解决方案(第二个解决方案)上设置迁移,以便我可以应用模型更改,所以我:
- 启用自动创建 InitialMigration 的迁移 Enable-Migrations -ContextTypeName 上下文
- 根据https://www.apress.com/gp/blog/all-blog-posts/secular-trends-for-the-cloud/12097630 的建议进行空白迁移 添加迁移 InitialBlank -IgnoreChanges
- 更新数据库 * update-database*
- 更改我的模型
- 添加包含我的模型更改的迁移 * Add-Migration add_entity*
- 运行更新数据库
所以我删除了创建的数据库,因为我需要运行第一个解决方案来创建初始数据库设置(模拟实时)。
当我运行第一个解决方案时,它会在 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]。在尝试生成新的显式迁移之前应用挂起的显式迁移。
我的问题:
- 如何解决 MigrationId 不匹配的问题?由于第一个解决方案没有打开迁移,当我打开它们时(在第二个解决方案中)它会创建一个新的 id。
- 异常 System.InvalidOperationException: 'The model backing the 'Context' 是否会因 MigrationId 不匹配而引发,或者谁能指出为什么会发生这种情况?我已经查看了这个错误,但我发现的解决方案似乎不起作用:
- 删除迁移历史记录表并不好,因为由于客户数据,我无法在生产中执行此操作。
- 我发现将 Database.SetInitializer(null); 添加到 global.asax 的另一个解决方案似乎没有任何区别。
- 为什么在迁移历史记录表中应用后,我的迁移顺序看起来会有所不同?
提前致谢!
【问题讨论】:
-
请谨慎使用自动迁移。它们有时会引起偏头痛,不值得承受压力。根据我的经验,我禁用自动迁移,并在需要时简单地运行 Create Migration 命令。然后我可以在应用之前修改迁移的内容。请记住这一点。
标签: c# entity-framework migration entity-framework-migrations