mcpField
M
migrations

migrations

github.com/dotnet开发14.8k61 次安装今天更新
代码仓库

关于 migrations

用于开发 Entity Framework Core 迁移功能的技能,涵盖迁移生成与应用、快照兼容处理及回归测试。

主要功能

  1. 01迁移生成与应用流程
  2. 02快照兼容与规范化
  3. 03关系模型差异分析
  4. 04迁移回归测试指导

适用场景

  1. 01排查意外的迁移操作
  2. 02测试旧模型快照兼容性
  3. 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 调用。

评论

支持 Markdown