笔记:在Entity Framework Core中使用乐观并发控制来处理数据更新的冲突

一、目的:

在Entity Framework Core (EF Core) 中配置乐观并发控制主要涉及到使用并发令牌。并发令牌是在模型中定义的属性,用于在数据库操作期间检测并发冲突。当两个或更多用户尝试同时更新同一条记录时,EF Core 会使用这些令牌来确定是否有其他用户已经修改了数据。

二、实现

1. 定义并发令牌

你可以通过在实体类的属性上使用ConcurrencyCheck属性或使用Fluent API的.IsConcurrencyToken()方法来定义并发令牌。

cs 复制代码
using System.ComponentModel.DataAnnotations;

public class SomeEntity
{
    public int Id { get; set; }
    
    [ConcurrencyCheck]
    public string ConcurrencyToken { get; set; }
}
cs 复制代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeEntity>()
        .Property(e => e.ConcurrencyToken)
        .IsConcurrencyToken();
}

2. 处理并发冲突

当发生并发更新时,EF Core会抛出一个DbUpdateConcurrencyException异常。你需要捕获这个异常并根据你的业务逻辑处理冲突。处理并发冲突通常涉及到重新加载实体的最新版本,让用户决定如何解决冲突,或者自动重试更新。

cs 复制代码
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 允许你灵活地处理并发更新,确保数据的一致性和完整性。

三、需要了解的知识点

ConcurrencyCheckAttributeConvention 类 (Microsoft.EntityFrameworkCore.Metadata.Conventions) | Microsoft Learn

乐观并发:概述 - 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轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
Swilderrr10 小时前
论文精读:《Directory-Aware Query and Maintenance in Vector Databases》
笔记·学习
SatanII10 小时前
K8s 存储与配置管理|Volume、ConfigMap、Secret 核心笔记
笔记·rpc·kubernetes
I'mChloe12 小时前
飞牛NAS部署flatnotes实战:Docker、8080端口、Markdown笔记与固定地址访问
笔记·docker·容器
库玛西13 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
摇滚侠13 小时前
《Java并发编程之美》第 2 章 并发编程的其他基础知识 阅读笔记 3
android·java·笔记
ss27314 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 18 PostgreSQL基本索引原理与创建
数据库·笔记·postgresql
qq_2842740515 小时前
电气控制笔记:常用低压电器符号原理与异步电动机点动、自锁、多地控制电路(含考点)
笔记·学习·自动化·制造
坤坤子吖15 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
乐橙开放平台15 小时前
不用换摄像头,如何用乐橙把海康、大华、宇视统一到一个界面
笔记·物联网·自动化·音视频·智能家居
凯凯姜16 小时前
Vue 3 深入学习笔记 16:API 请求封装与统一错误处理
vue.js·笔记·学习