About update-pipeline
A development skill for the Entity Framework Core update pipeline, from tracked entity changes to database commands. It covers command ordering, batching, concurrency checks, and validation.
Key features
- 01Change detection and command preparation
- 02Foreign-key dependency ordering
- 03SQL generation and command batching
- 04Concurrency token checks
- 05Store-generated value validation
Use cases
- 01Tracing SaveChanges command execution
- 02Testing foreign-key ordering and batching
- 03Validating stale-write concurrency errors
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ dotnet/ efcore --skill update-pipelineAfter installing, type/update-pipelinein Claude Code to confirm it loaded.
Details
From the project READMEUpdate Pipeline
Converts tracked entity changes into database INSERT/UPDATE/DELETE commands during SaveChanges().
Flow
SaveChanges() → DetectChanges() → IDatabase.SaveChanges() → UpdateAdapter creates IUpdateEntry list → CommandBatchPreparer.BatchCommands()
→ ModificationCommand per table row, composed of ColumnModification per column
→ SharedTableEntryMap is used to track entries mapped to the same row
→ Topological sort via Multigraph (FK dependency ordering)
→ Groups into ModificationCommandBatch (respects max batch size)
→ UpdateSqlGenerator generates SQL per batch → BatchExecutor executes all batches in a transaction → StateManager.AcceptAllChanges()
Concurrency
Concurrency tokens → WHERE conditions on UPDATE/DELETE. AffectedCountModificationCommandBatch checks affected rows. Throws DbUpdateConcurrencyException on mismatch.
Shared-Row Value Access
Command state describes the row operation, not every entry: an Added replacement with a Deleted SharedIdentityEntry can participate in a Modified command. Original-value access must use the original value from the deleted shared entry, preserving the previous FK for dependency ordering.
Validation
SaveChanges()returns expected affected row count- Store-generated values propagate back to entities after INSERT/UPDATE
DbUpdateConcurrencyExceptionthrown when expected for stale data