通八洲科技

EF Core如何配置并发令牌 EF Core IsConcurrencyToken方法

日期:2025-12-16 00:00 / 作者:幻夢星雲
EF Core 配置并发令牌的核心目标是启用乐观并发控制以防止“丢失更新”,通过 SaveChanges() 时比对原始值,不一致则抛出 DbUpdateConcurrencyException;推荐使用 1770375147 注解(SQL Server 支持 rowversion)或 Fluent API 的 IsRowVersion()(数据库自动管理),若用 IsConcurrencyToken() 则需手动维护字段值,并必须捕获异常处理。

EF Core 配置并发令牌的核心目标是启用乐观并发控制,防止“丢失更新”——即多个用户同时读取同一行、各自修改后保存,后保存者无意中覆盖前者的更改。关键不在于“加锁”,而是在 SaveChanges() 时自动比对原始值,不一致就抛出 DbUpdateConcurrencyException,由你决定如何响应。

两种主流配置方式:数据注解 vs Fluent API

你可以任选其一,推荐 Fluent API(更集中、可测试、不污染实体类);但 1770375147 注解因数据库原生支持,仍是首选。

IsConcurrencyToken() 和 IsRowVersion() 的区别

IsConcurrencyToken() 是通用方法,把任意属性设为并发检查点,但值要靠代码维护;IsRowVersion() 是专用于 rowversion / timestamp 列的快捷方式,仅 SQL Server 支持,数据库自动管理值,更可靠。

配置后必须处理异常,否则并发冲突直接崩掉

配置完令牌只是第一步。真正起作用的是捕获 DbUpdateConcurrencyException 并做合理应对,常见策略有:

验证是否生效的小技巧

写个简单测试:查出一条记录 → 手动用 SQL 修改数据库里对应的 RowVersion 或并发字段 → 再调用 SaveChanges()。如果抛出 DbUpdateConcurrencyException,说明配置成功。

基本上就这些。不复杂但容易忽略的是:配了令牌却没处理异常,或者用了 IsConcurrencyToken() 却忘了更新字段值——这两点会让乐观锁完全失效。