Start here. This is the direct spoken answer to practice first.
Why this question matters
Lost updates are easy to miss in normal CRUD demos. This drill connects SQL rowversion behavior to the API contract users actually experience.
I mark a SQL Server rowversion property as an EF Core concurrency token and return its encoded value when the client reads the resource. The client sends that version with the update, and EF Core includes the original token in the update predicate. If another write changed the row, zero rows are affected and SaveChangesAsync throws DbUpdateConcurrencyException. The API returns a conflict or failed precondition instead of silently overwriting the newer state.