在Entity Framework Core (EF Core) 中配置乐观并发控制主要涉及到使用并发令牌。并发令牌是在模型中定义的属性,用于在数据库操作期间检测并发冲突。当两个或更多用户尝试同时更新同一条记录时,EF Core 会使用这些令牌来确定是否有其他用户已经修改了数据。
你可以通过在实体类的属性上使用[ConcurrencyCheck]属性或使用Fluent API的.IsConcurrencyToken()方法来定义并发令牌。
- using System.ComponentModel.DataAnnotations;
-
- public class SomeEntity
- {
- public int Id { get; set; }
-
- [ConcurrencyCheck]
- public string ConcurrencyToken { get; set; }
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity
() - .Property(e => e.ConcurrencyToken)
- .IsConcurrencyToken();
- }
当发生并发更新时,EF Core会抛出一个DbUpdateConcurrencyException异常。你需要捕获这个异常并根据你的业务逻辑处理冲突。处理并发冲突通常涉及到重新加载实体的最新版本,让用户决定如何解决冲突,或者自动重试更新。
- try
- {
- // 尝试保存更改到数据库
- context.SaveChanges();
- }
- catch (DbUpdateConcurrencyException ex)
- {
- // 处理并发冲突
- // 例如,可以重新加载实体的最新状态
- foreach (var entry in ex.Entries)
- {
- var proposedValues = entry.CurrentValues;
- var databaseValues = entry.GetDatabaseValues();
-
- foreach (var property in proposedValues.Properties)
- {
- var proposedValue = proposedValues[property];
- var databaseValue = databaseValues[property];
-
- // TODO: 决定如何解决冲突
- // 例如,可以选择保留数据库的值或用户提出的值
- }
-
- // 更新原始值以匹配数据库的当前值
- entry.OriginalValues.SetValues(databaseValues);
- }
-
- // 重新尝试保存更改
- context.SaveChanges();
- }
通过这种方式,EF Core 允许你灵活地处理并发更新,确保数据的一致性和完整性。
乐观并发:概述 - ADO.NET | Microsoft Learn
Microsoft.EntityFrameworkCore 命名空间 | Microsoft Learn
System.Windows.Controls 命名空间 | Microsoft Learn
GitHub - HeBianGu/WPF-ControlDemo: 示例
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库