SuperAPI AI 工具集

migrations

编程与开发

查看项目

更新于 10-15 21:12

技能介绍

本技能聚焦 EF Core 迁移(Migrations)的内部实现细节,适用于修改 MigrationsSqlGenerator、模型差异比较(model diffing)、迁移操作、HistoryRepository、Migrator 等代码时参考。

流程方面:添加迁移走 MigrationsScaffolder.ScaffoldMigration() → MigrationsModelDiffer.GetDifferences() → 生成 MigrationOperation 列表 → 由 CSharpMigrationsGenerator 与 CSharpSnapshotGenerator 生成 Up/Down/Snapshot 代码。应用迁移走 Migrator.MigrateAsync() → 读取 __EFMigrationsHistory → 对每个待执行迁移调用 MigrationsSqlGenerator.Generate(operations) → MigrationCommandExecutor 执行。

模型快照:快照使用 typeof(Dictionary<string, object>)(属性包格式),并非真实 CLR 类型,检查快照的 ClrType 时不要假设它等于真实实体类型。SnapshotModelProcessor.Process() 在设计时用于修复旧模型快照以保持向后兼容。MigrationsModelDiffer 对关系模型做与提供程序无关的结构比较,决定需要哪些迁移操作。

仅升级型回归:派生一个具体的旧 ModelSnapshot,用 SnapshotModelProcessor.Process(..., resetVersion: true) 处理其模型,再通过 MigrationsModelDiffer.GetDifferences() 与等价的当前设计时模型比较。保留旧快照产生的属性包 CLR 类型,并省略会显式配置该版本中不存在的元数据的 API。只有当结果操作列表为空时,回归才算通过。旧快照规范化应放在 SnapshotModelProcessor 中,不要放在运行时迁移应用中。兼容分支应限定在可能产生受影响快照形状的确切已发布版本;在该特性存在之前的版本不应仅因数字更小而被纳入。当可变元数据接口暴露所需 setter 时优先使用它,而不是强转到具体元数据实现。为门控点名的每个版本系列及第一个不受影响的版本添加聚焦覆盖。

测试位置:迁移操作测试在 test/EFCore.Relational.Tests/Migrations/;功能测试在 test/EFCore.{Provider}.FunctionalTests/Migrations/;模型差异比较测试在 test/EFCore.Relational.Tests/Migrations/Internal/MigrationsModelDifferTest*.cs。模拟快照模型时使用不带约定的 ModelBuilder 调用。