【EF Core】 7. 全局查询筛选器、并发控制

.net core EF Core 高级用法 Entity Framework Core (EF Core) 是一种轻量级、跨平台、可扩展的对象关系映射 (ORM) 框架,用于 .NET 应用程序。EF Core 提供了强大的功能来让开发者高效且易于使用数据库。本文将讨论 EF Core 的一些高级用法。 阅读详情

本系列专栏基于杨中科老师的《ASP.NET Core技术内幕与项目实战》,本人记录梳理的学习笔记,有部分的增补和省略。更全面系统的讲解,请看杨老师的视频课:【.NET教程,.Net Core视频教程,杨中科主讲】。

一、全局查询筛选器

1. 定义

EF Core 全局查询筛选器是自动生效的过滤条件,一旦配置,所有针对该实体的 LINQ 查询、延迟加载、Include 关联查询都会自动附加这个筛选条件,无需手动重复编写过滤代码。

应用场景:软删除(逻辑删除)、多租户数据隔离、数据权限过滤。

2. 底层原理

EF Core 在生成 SQL 语句时,会自动拼接配置好的过滤条件到查询语句中,对开发者无感知,简化代码且避免漏写条件导致的业务错误。

3. 使用步骤

(1)实体类添加软删除标记
public class Book
{
    public long Id { get; set; }
    public string Title { get; set; }
    // 软删除标记:false=未删除,true=已删除
    public bool IsDeleted { get; set; }
}
(2)在 OnModelCreating 中配置筛选器
// Fluent API 配置全局查询筛选器
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 所有查询 Book 实体的操作,自动过滤掉已删除数据
    modelBuilder.Entity<Book>()
                .HasQueryFilter(b => b.IsDeleted == false);
}
(3)正常查询
// 自动拼接 AND IsDeleted = false
var books = dbContext.Books.Where(b => b.Title.Contains("EF Core")).ToList();

4. 临时忽略全局筛选器

场景:管理员需要查看已删除 + 未删除的所有数据时,可手动关闭筛选器:

// IgnoreQueryFilters():忽略当前实体配置的所有全局查询筛选器
var allBooks = dbContext.Books
                       .IgnoreQueryFilters()
                       .Where(b => b.Title.Contains("测试"))
                       .ToList();

5. 特性与注意事项

  • 支持多条件组合:可同时配置软删除 + 多租户 ID 过滤
  • 继承生效:父实体配置筛选器,子类自动继承
  • 不影响插入 / 更新 / 删除:仅对查询操作生效
  • 避免循环依赖:筛选器中不要编写跨实体循环引用逻辑

二、并发控制

当多个用户同时修改同一条数据时,会引发数据覆盖问题,EF Core 提供两种并发控制方案:悲观并发控制(锁定资源)和 乐观并发控制(无锁校验)。

1. 悲观并发控制

(1)定义

采用排他锁(行锁 / 表锁),在查询数据时就锁定资源,锁定期间其他用户无法修改 / 删除,直到事务提交释放锁。

(2)场景

并发量低、数据一致性要求极高的业务(如金融扣款、库存扣减)。

(3)示例

EF Core + MySQL 实现(FOR UPDATE 行锁)

// 开启事务
using (var transaction = await dbContext.Database.BeginTransactionAsync())
{
    try
    {
        // 使用 FromSqlInterpolated 执行 FOR UPDATE,锁定指定行数据
        var house = await dbContext.Houses
                          .FromSqlInterpolated($"SELECT * FROM T_Houses WHERE Id=1 FOR UPDATE")
                          .SingleAsync();

        // 执行业务修改
        house.Owner = "新户主";
        await dbContext.SaveChangesAsync();

        // 提交事务,释放锁
        await transaction.CommitAsync();
    }
    catch (Exception ex)
    {
        // 回滚事务
        await transaction.RollbackAsync();
        Console.WriteLine($"操作失败:{ex.Message}");
    }
}
  • 优点:数据强一致,不会出现并发冲突
  • 缺点:独占锁会阻塞其他请求,高并发场景下性能极差;使用不当极易引发死锁

2. 乐观并发控制(推荐)

(1)定义

不加锁,仅在执行更新 / 删除时,校验数据是否被其他用户修改;若已修改,抛出并发异常,由开发者处理冲突。核心思想是假设冲突极少发生,发生后再处理,性能最优。

(2)通用实现

自定义并发令牌(支持 MySQL / PostgreSQL 等所有数据库)。更新时拼接校验条件,只有满足条件才执行修改:

-- 只有 Owner 未被修改时,才更新数据
UPDATE T_Houses 
SET Owner = '新值' 
WHERE Id = 1 AND Owner = '旧值';
(3)具体步骤

1.实体类添加并发字段

public class House
{
    public long Id { get; set; }
    public string Owner { get; set; }
    // 标记为并发令牌
    public string Token { get; set; } 
}

2.Fluent API 配置

modelBuilder.Entity<House>()
            .Property(h => h.Token)
            .IsConcurrencyToken(); // 标记为并发令牌

3.业务代码 + 异常捕获

try
{
    // 修改数据
    var house = dbContext.Houses.FirstOrDefault(h => h.Id == 1);
    house.Owner = "新户主";
    house.Token = Guid.NewGuid().ToString(); // 更新令牌

    // 保存时自动校验并发
    await dbContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
    // 捕获并发冲突异常
    Console.WriteLine("数据已被其他用户修改,并发冲突!");
    
    // 可选:获取冲突数据,实现自动重试/合并
    var exceptionEntry = ex.Entries.First();
    var currentValues = exceptionEntry.CurrentValues; // 当前修改的值
    var databaseValues = exceptionEntry.GetDatabaseValues(); // 数据库最新值
}
(4)SQL Server 专用实现:ROWVERSION 类型

SQL Server 提供 rowversion(timestamp)字段,数据修改时自动更新,无需手动维护,是最优方案。

实现步骤:

实体类添加行版本字段

public class House
{
    public long Id { get; set; }
    public string Owner { get; set; }
    // 行版本字段(SQL Server自动维护)
    public byte[] RowVersion { get; set; }
}

Fluent API 配置

modelBuilder.Entity<House>()
            .Property(h => h.RowVersion)
            .IsRowVersion(); // 标记为行版本

直接使用(无需手动修改 RowVersion)

try
{
    var house = dbContext.Houses.FirstOrDefault(h => h.Id == 1);
    house.Owner = "新户主";
    await dbContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
    Console.WriteLine("并发冲突,操作失败");
}

总结

  1. 全局查询筛选器:自动过滤查询数据,软删除、多租户首选方案;配置:HasQueryFilter(),临时关闭:IgnoreQueryFilters()。

  2. 并发控制选型:低并发、强一致性 → 悲观并发控制(排他锁);高并发、性能优先 → 乐观并发控制(推荐);MySQL:自定义 IsConcurrencyToken;SQL Server:IsRowVersion(最优);统一捕获异常:DbUpdateConcurrencyException。

C#如何利用EF Core的集成事件与审计追踪,让你的App晋升顶级联赛? 在EF Core的炼金术士世界里,自定义转换器赋予了我们转换数据类型的魔力,而全局查询筛选器则是守护数据纯净的不朽守卫。这一章节,我们将踏入这个充满魔法与智慧的实验室,探索这两项技艺的奥秘。想象一下,数据库中存储的数据类型与应用程序中的不一致,就像两种不同的语言。自定义转换器,就是那枚能翻译这两种语言的神奇戒指。bool1 : 0 , // 真变1,假变0 i => i!= 0) // 0变假,非0变真 { 阅读详情

相关推荐

基于Claude AI的Dex个人操作系统:从零部署到高效工作流实战

在当今信息过载的时代,个人知识管理(PKM)和任务自动化成为提升效率的关键技术。传统PKM工具如Notion、Obsidian虽然提供了强大的信息存储能力,但本质上是被动的数据库,需要用户手动维护结构和链接,容易形成信息孤岛。其核心原理在于通过预设的文件夹结构和智能路由,实现信息的自动归类与关联。这种自动化同步机制的技术价值在于彻底消除重复劳动和决策疲劳,让用户从繁琐的信息整理中解放出来,专注于高价值思考。在实际应用场景中,它尤其适合需要处理大量会议、任务和人际关系的知识工作者,如产品经理、项目经理和团队领

weixin_42521558的博客 378

EFCore_查询过滤器(默认条件)

此后,所有查询命令均会默认添加过滤器。此时,该查询命令会忽略过滤器。

Mudrock__的博客 488

别再只会用串口助手了!手把手教你用手机App调试HC-05蓝牙模块(STM32F103实战)

本文详细介绍了如何利用手机App调试HC-05蓝牙模块与STM32F103的无线连接,突破传统串口助手的限制。通过实战指南,开发者可以掌握移动性测试、实时监控和快速验证等高效调试技巧,优化蓝牙透传的稳定性和性能。

weixin_33670786的博客 428

Entity Framework Core并发处理(解决竞态条件与乐观锁的终极方案)

掌握Entity Framework Core并发处理,有效解决竞态条件与数据冲突。结合C#ORM 框架:Entity Framework Core 进阶,深入讲解乐观锁机制、Timestamp和ConcurrencyCheck属性的应用场景与优势,提升数据一致性与系统可靠性,值得收藏。

QuickTrans的博客 488

大一Python之循环解决实际问题

pythin之循环解决实际问题

weixin_66263546的博客 2287

手把手教你用Multisim搭建FM直接调频电路(附完整波形分析)

本文通过Multisim仿真软件,手把手教你搭建FM直接调频电路。详细介绍了从核心概念理解、压控振荡器(VCO)参数设置、电路搭建与波形观测,到带通滤波器设计与信号优化的完整流程。通过对比滤波前后的时域波形与频谱分析,帮助读者直观理解频率调制原理,并提供了常见问题的排查思路与参数调试方法,将抽象的通信理论转化为可操作的实践技能。

weixin_29230773的博客 214

EF Core 全局查询筛选器

场景:软删除,如果客户 删掉 数据 需要 恢复,或者 银行的账号 注销,某部门需要调取,所以不能 直接 从 数据库中 删除 数据 而是 在需要删除数据的表中 在增加一个字段 比如 IsDelete bool 类型, 但是 每次 查询 或其他操作 都。这样做的原因是 因为生成的语句类似是 select * from T_Books where IsDelete=true and IsDelete=false。加粗的 就是 每次 必须带上的 语句,因为 软删除 就是把。默认带上这句sql语句。

q8812345qaz的博客 576

服务器能效测试工具BenchSEE使用方法简介

BenchSEE是由中国标准化研究院开发的一款针对服务器产品能效测试的基准软件。BenchSEE基准的设计参考了全球众多服务器厂家、芯片厂家、能效认证机构和IT节能领域科研机构的意见,旨在满足服务器市场应用对能效测评的需求。BenchSEE基准负载工具支持的服务器类型包括:机架服务器、刀片服务器多节点服务器和机柜服务器等,服务器可以配的最大外理器个数包括:1P,2P和4P等。测试基准涵盖服务器关键部件:CPU,内存和存储介质三大基础部件。

MQWYY3的博客 4216

EF Core全局查询过滤器:自动应用查询条件的智能方式

你是否经常在多个查询中重复编写相同的过滤条件?比如在多租户系统中过滤当前租户的数据,或者软删除系统中过滤已删除的记录?EF Core的全局查询过滤器(Global Query Filters)正是为解决这类问题而生,它能自动为所有查询应用预定义的过滤条件,大幅提升开发效率和代码维护性。 ## 什么是全局查询过滤器? 全局查询过滤器是EF Core提供的一种强大功能,允许你在模型配置时为实体类型...

gitblog_00632的博客 988

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

本文介绍了连续图像和数字图像直方图匹配(直方图规定化)的原理、处理过程,并提供了案例进行了讲解。可以看到,直方图均衡处理是直方图匹配的一个重要桥梁。 最后,对于直方图规定化这个翻译个人觉得很low,个人感觉叫指定直方图更好理解,但Histogram Specification怎么翻译确实不太好把握,因此还是叫Histogram Matching直方图匹配最好。

老猿Python 2880

.Net Core之OData

.Net Core之OData OData可以说是轻量级的GraphQL,但又和GraphQL不同,配合Linq和EFCore,可以极大简化接口,提高开发效率。 但全套OData过重,坑也不少,所以我在项目里只使用了其Get部分的功能,同时重写了部分功能,配合EFCore实现高效开发 引入 services.AddOData(); services.AddODataQueryFilter(); 启用 public static class ODataExtension { public

2ker的博客 942

Android So加载机制分析----基于Android14源码

本文深入分析Android 14系统中SO(共享库)的两种加载机制:System.loadLibrary()和System.load()。前者通过ClassLoader查找标准路径加载,后者直接加载指定路径的SO文件。文档详细追踪了从Java层到动态链接器的完整加载链路,包括ClassLoader路径查找、JNI桥接、ART虚拟机处理以及底层linker的符号解析和重定位过程。同时还分析了Namespace隔离、JNI_OnLoad机制等核心内容,为开发者提供全面的SO加载技术解析和问题排查指南。

保持专注,保持热爱 350

EF Core并发处理:处理高并发场景的专业策略

在现代应用开发中,高并发场景已成为常态。当多个用户或进程同时访问和修改相同数据时,如何确保数据的一致性和完整性成为关键挑战。EF Core(Entity Framework Core)作为.NET平台的主流ORM框架,提供了强大的并发控制机制来应对这一挑战。 本文将深入探讨EF Core的并发处理策略,涵盖乐观并发控制、悲观并发检测、并发令牌配置以及异常处理机制,帮助开发者构建健壮的高并发应用。...

gitblog_00787的博客 1148

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Entity Framework Core 实现全局查询过滤

微软在 Entity Framework Core 2+ 中引入了全局查询过滤器,简化了构建多租户应用程序和实体软删除的复杂度。这篇文章我将通过代码的形式对全局过滤查询进行详细的讲解。在讲解前我们先来简单说一下什么是多租户,所谓多租户简单来说是指一个单独的实例可以为多个组织服务。多租户技术为共用的数据中心内如何以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍然可以保障客户的数据隔离...

喵叔 1643

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Entity Framework Core 2.0 全局查询过滤器

本博文翻译自:http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ Entity Framework Core 2.0 全局查询过滤器 Entity Framework Core 2.0引入了全局查询过滤器,可以在创建模型时应用到实体 。它使得构建多租户应用程序和支持对实体 的软删除变得更加容易。这篇博客文章提供了关于如何

dotNET跨平台 632

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

EntityFramework Core 2.0全局过滤(HasQueryFilter)

前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求。在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢?这是我们需要思考的问题。通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库表的所有查询额外添加一模一样的过滤器。它主要用于软删除...

weixin_34392906的博客 407

浅析Entity Framework Core中的并发处理

前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式.     1.常见的并发处理策略 要了解如何处理并发,就要知道并发的一般处理策略 悲观并发策略 悲观并发策略,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持...

weixin_34342578的博客 503

ASP.NET Core 3.X EF 并发冲突

当某用户显示实体数据以对其进行编辑,而另一用户在上一用户的更改写入数据库之前更新同一实体的数据时,会发生并发冲突。 如果不启用此类冲突的检测,则最后更新数据库的人员将覆盖其他用户的更改。 在许多应用程序中,此风险是可接受的:如果用户很少或更新很少,或者一些更改被覆盖并不重要,则并发编程可能弊大于利。 在此情况下,不必配置应用程序来处理并发冲突。 悲观并发(锁定) 如果应用程序确实需要防止并发情况下...

charly 692

ef core 全局过滤

有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了。 微软自带的:https://docs.microsoft.com/zh-cn/ef/core/querying/filters 特殊针对的过滤:https://entityframework-plus.net/query-filter 准备: nuget Z.Ent...

weixin_30869099的博客 685

EF Core并发冲突处理方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、并发冲突的处理方式1. 悲观并发(锁定)2. 乐观并发二、乐观并发的处理步骤1.在模型的属性上应用并发标记(不推荐)2.在模型中新增时间戳作为并发标记(推荐) 前言 介绍EF Core如何处理多个用户同时更新同一实体数据时出现的冲突。 一、并发冲突的处理方式 1. 悲观并发(锁定) 在从数据库读取一行内容之前,请求锁定为只读或更新访问 如果将一行锁定为更新访问,则其他用户无法将该行锁定为只读或更新访问,因为他们得到的是.

mikefbi的博客 2588

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 316

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 176

C# NAFNet 图片去模糊

基于NAFNet与ONNX Runtime的C# WinForms图片去模糊工具,支持DirectML GPU加速与CPU回退,实现一键去模糊、大图分块处理、并排对比及拖拽打开。具备高DPI适配、自绘圆角界面、命令行批量处理等功能,适用于Windows 10/11系统,可灵活配置模型路径与分块大小,解决显存不足与边缘接缝问题。

hixiong123的博客 260

使用C#代码提取、修改或删除 Excel 中的超链接

通过 C# 和 VB.NET,可以方便地管理 Excel 文件中的超链接,包括提取、修改和删除等操作。提取超链接: 获取工作表中的超链接集合,读取每个超链接的地址和类型,并将相关信息保存到文本文件中。修改超链接: 更新超链接的显示文本和目标地址,确保链接信息准确。删除超链接: 移除指定的超链接,同时可以选择保留单元格中的原有显示文本,或清除单元格的全部内容。这些操作可以帮助开发人员更高效地管理 Excel 文档中的链接信息,减少重复的手动操作,也便于在数据迁移、文档维护和自动化报表处理等场景中使用。

2501_93070778的博客 236

C#: 控件不支持透明的背景色

把透明度固定为255。

海天鹰 44
上一篇: 【EF Core】 6. 执行原生SQL、更改跟踪
下一篇: 【EF Core】 8. 委托、表达式树
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值