EF Core迁移执行机制及多环境部署顺序异常原因咨询
1. EF Core 如何在数据库上应用迁移?
EF Core 应用迁移的核心流程如下:
- 读取项目中所有已定义的迁移文件,每个迁移包含
Up(执行数据库变更)、Down(回滚变更)方法,以及唯一的时间戳前缀作为MigrationId的一部分。 - 连接目标数据库后,检查默认名为
__EFMigrationsHistory的系统表,该表记录了已成功应用的迁移。 - 对比本地迁移文件与历史表记录,筛选出所有未被应用的迁移。
- 按照
MigrationId的字典序(即时间戳的先后顺序)依次执行未应用迁移的Up方法,将变更同步到数据库。 - 每完成一个迁移的执行,就向
__EFMigrationsHistory表插入一条记录,标记该迁移已完成。
2. Stage/Production 环境迁移顺序混乱的可能原因
结合你提供的迁移历史记录,以及EF Core从3.1.25升级到6.0.6的背景,可能的原因包括:
- 分批部署或版本回退操作导致迁移执行顺序错位:
如果Stage环境先部署了仅包含6月20日新迁移的代码包,EF Core会优先执行这些迁移并写入历史表;之后若部署了包含早期迁移(6月7日、6月17日批次)的旧版本代码,EF Core检测到这些迁移未在历史表中记录,就会执行它们,最终导致历史表中迁移顺序颠倒。这种情况多发生在未严格遵循版本递增发布流程,或存在临时回退再升级的场景。 - EF Core版本升级带来的迁移识别逻辑变化:
EF Core 3.1到6.0的迁移系统存在部分逻辑调整,例如对迁移依赖关系的处理、MigrationId的解析规则。若旧迁移在版本升级后被EF Core重新识别为未执行状态(比如迁移文件的元数据被意外修改),就可能出现新迁移先执行、旧迁移后执行的情况。 - 手动操作干扰了迁移历史或文件:
若有人手动修改了迁移文件的时间戳前缀,或直接在__EFMigrationsHistory表中插入了6月20日的迁移记录,后续部署包含早期迁移的代码时,EF Core会判定这些早期迁移未完成,进而执行它们,打乱原有顺序。 - 迁移文件未被完整纳入部署包:
早期的迁移文件在某次部署中未被包含到发布包内,导致EF Core当时无法检测到它们;后续部署补上这些文件后,EF Core才执行这些遗漏的迁移,造成历史表顺序混乱。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

