关于 update-pipeline
用于 Entity Framework Core 更新管线开发的技能,介绍如何将跟踪的实体变更转为数据库命令,并涵盖命令排序、批处理、并发检查和验证。
主要功能
- 01变更检测与命令准备
- 02外键依赖排序
- 03SQL 生成与命令批处理
- 04并发令牌检查
- 05存储生成值验证
适用场景
- 01跟踪 SaveChanges 命令执行过程
- 02测试外键排序与批处理
- 03验证过期写入的并发错误
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dotnet/ efcore --skill update-pipeline安装后在 Claude Code 中输入/update-pipeline确认已加载。
详细介绍
更新管道
在 SaveChanges() 期间,将已跟踪的实体更改转换为数据库 INSERT/UPDATE/DELETE 命令。
流程
SaveChanges() → DetectChanges() → IDatabase.SaveChanges() → UpdateAdapter 创建 IUpdateEntry 列表 → CommandBatchPreparer.BatchCommands()
→ 每个表行对应一个 ModificationCommand,由每列对应的 ColumnModification 组成
→ 使用 SharedTableEntryMap 跟踪映射到同一行的条目
→ 通过 Multigraph 进行拓扑排序(按 FK 依赖关系排序)
→ 分组为 ModificationCommandBatch(遵循最大批次大小)
→ UpdateSqlGenerator 为每个批次生成 SQL → BatchExecutor 在事务中执行所有批次 → StateManager.AcceptAllChanges()
并发
并发令牌 → UPDATE/DELETE 的 WHERE 条件。AffectedCountModificationCommandBatch 会检查受影响的行数。不匹配时抛出 DbUpdateConcurrencyException。
共享行值访问
命令状态描述的是行操作,而非每个条目:带有已删除 SharedIdentityEntry 的 Added 替换项可以参与 Modified 命令。访问原始值时,必须使用已删除共享条目中的原始值,以保留用于依赖关系排序的先前 FK。
验证
SaveChanges()返回预期的受影响行数- INSERT/UPDATE 后,存储生成的值会传播回实体
- 预期会发生时,针对过时数据抛出
DbUpdateConcurrencyException