Implementation details for EF Core SaveChanges and the update pipeline. Use when changing CommandBatchPreparer, UpdateSqlGenerator, ModificationCommand, or related classes.
Converts tracked entity changes into database INSERT/UPDATE/DELETE commands during SaveChanges().
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 tokens → WHERE conditions on UPDATE/DELETE. AffectedCountModificationCommandBatch checks affected rows. Throws DbUpdateConcurrencyException on mismatch.
SaveChanges() returns expected affected row countDbUpdateConcurrencyException thrown when expected for stale data