关于 migrations
用于开发 Entity Framework Core 迁移功能的技能,涵盖迁移生成与应用、快照兼容处理及回归测试。
主要功能
- 01迁移生成与应用流程
- 02快照兼容与规范化
- 03关系模型差异分析
- 04迁移回归测试指导
适用场景
- 01排查意外的迁移操作
- 02测试旧模型快照兼容性
- 03添加针对性的迁移回归测试
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dotnet/ efcore --skill migrations安装后在 Claude Code 中输入/migrations确认已加载。
详细介绍
迁移
流程
添加迁移: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 调用。