在事务提交/回滚时触发逻辑:EntityFrameworkCore.Triggered的Transactions事务扩展完整指南
在事务提交/回滚时触发逻辑EntityFrameworkCore.Triggered的Transactions事务扩展完整指南【免费下载链接】EntityFrameworkCore.TriggeredTriggers for EFCore. Respond to changes in your DbContext before and after they are committed to the database.项目地址: https://gitcode.com/gh_mirrors/en/EntityFrameworkCore.TriggeredEntityFrameworkCore.Triggered 是 EF Core 生态的触发器库它的Transactions 事务扩展允许你在事务提交前后、回滚前后精确挂接业务逻辑——例如仅在数据真正落库后发送通知、发布领域事件或在回滚时清理缓存。本文用通俗的方式带你 5 分钟掌握这个事务扩展的核心概念、最小可用示例与常见问题。一、为什么 BeforeSave / AfterSave 不够用先理解 EF Core 中一个容易被忽视的事实使用 SqlServer 等数据库时每次SaveChanges默认都会被包裹在一个自动事务里。EntityFrameworkCore.Triggered 基础版的两类触发器时机是触发器执行时机其修改是否包含在事务内IBeforeSaveTriggerTSaveChanges写库之前✅ 是IAfterSaveTriggerTSaveChanges写库之后❌ 否问题在于AfterSave 执行时事务并不一定已经提交。如果在这个时点发送邮件、调用第三方 API 或发布事件一旦事务随后回滚就会出现钱没扣、短信却发了的脏通知问题。Transactions 扩展正是为解决这个时机缝隙而设计它新增了 4 组精确对齐数据库事务边界的触发器。二、认识 8 个事务触发器接口同步 异步各一套Transactions 扩展提供 4 组触发器每组都有同步与异步两种写法触发时机同步接口异步接口典型用途提交前IBeforeCommitTriggerTIBeforeCommitAsyncTriggerT最后校验、生成快照提交后IAfterCommitTriggerTIAfterCommitAsyncTriggerT发通知、发事件、清缓存回滚前IBeforeRollbackTriggerTIBeforeRollbackAsyncTriggerT记录回滚原因回滚后IAfterRollbackTriggerTIAfterRollbackAsyncTriggerT恢复缓存、补偿逻辑这 8 个接口定义在 Transactions.Abstractions 项目中。以提交后的异步触发器 IAfterCommitAsyncTrigger.cs 为例它只有一个方法public interface IAfterCommitAsyncTriggerin TEntity where TEntity : class { Task AfterCommitAsync(ITriggerContextTEntity context, CancellationToken cancellationToken); }触发器通过ITriggerContextT拿到本次变更的实体、变更类型Added / Modified / Deleted等上下文信息接口定义见 ITriggerContext.cs。 建议一律使用异步版本避免同步阻塞引发的死锁问题。三、三步启用事务触发器安装、注册、手动管理事务第 1 步安装 NuGet 包dotnet add package EntityFrameworkCore.Triggered.Transactions第 2 步在 DbContext 配置中启用并注册触发器services.AddDbContextApplicationDbContext(options { options.UseTriggers(triggerOptions { triggerOptions .UseTransactionTriggers() // 启用事务触发器 .AddTriggerNotifyAfterCommitTrigger() .AddTriggerCleanupCacheOnRollbackTrigger(); }); });UseTransactionTriggers()的实现在 TriggersContextOptionsBuilderExtensions.cs它一次性把 8 个触发器类型外加生命周期接口注册进触发器系统。若你通过 DI 容器注册触发器这一步可以省略。第 3 步手动开启事务 创建触发器会话使用事务触发器的关键需要显式开启事务并手动控制触发顺序因此不能依赖库的自动会话管理而要自己创建触发器会话using var tx context.Database.BeginTransaction(); var triggerService context.GetServiceITriggerService(); var triggerSession triggerService.CreateSession(context); // 会话只跟踪自己发现的变更 try { await context.SaveChangesAsync(); await triggerSession.RaiseBeforeCommitAsyncTriggers(); await tx.CommitAsync(); await triggerSession.RaiseAfterCommitAsyncTriggers(); } catch { await triggerSession.RaiseBeforeRollbackAsyncTriggers(); await tx.RollbackAsync(); await triggerSession.RaiseAfterRollbackAsyncTriggers(); throw; }执行顺序一目了然SaveChangesAsync→ 数据写入事务尚未提交RaiseBeforeCommitAsyncTriggers→ 提交前最后检查CommitAsync→ 事务真正提交数据落库RaiseAfterCommitAsyncTriggers→ 只在数据确定入库后执行副作用出异常时走回滚分支依次执行两个回滚触发器后重新抛出。所有Raise*扩展方法的实现在 TriggeredSessionExtensions.cs。四、一个贴近实战的例子订单提交后才发短信// 只在订单真正提交入库后才发送短信 class OrderNotificationTrigger : IAfterCommitAsyncTriggerOrder { readonly ISmsService _sms; public OrderNotificationTrigger(ISmsService sms) _sms sms; public async Task AfterCommitAsync(ITriggerContextOrder context, CancellationToken ct) { if (context.ChangeType ChangeType.Added) { await _sms.SendOrderConfirmation(context.Entity, ct); } } } // 事务回滚后把写进缓存的订单草稿清掉 class OrderCacheCleanupTrigger : IAfterRollbackAsyncTriggerOrder { readonly ICacheService _cache; public OrderCacheCleanupTrigger(ICacheService cache) _cache cache; public Task AfterRollbackAsync(ITriggerContextOrder context, CancellationToken ct) { _cache.Remove($order:{context.Entity.Id}); return Task.CompletedTask; } }注意触发器只会针对本次会话内发现过的实体触发同一个 Order 不会被重复通知相关行为在 TriggeredSessionExtensionsTests.cs 中有完整单元测试验证。五、生命周期触发器一次提交只跑一次的汇总钩子如果逻辑与单个实体无关而是想在所有 BeforeCommit 触发器执行前/后统一做一件事比如批量统计可以使用Lifecycles命名空间下的 4 个生命周期接口位于 Transactions.Abstractions/Lifecycles/接口触发时机IBeforeCommitStartingTrigger/Async所有 BeforeCommit 触发器执行之前整个会话仅 1 次IBeforeCommitCompletedTrigger/Async所有 BeforeCommit 触发器执行之后仅 1 次IAfterCommitStartingTrigger/Async所有 AfterCommit 触发器执行之前仅 1 次IAfterCommitCompletedTrigger/Async所有 AfterCommit 触发器执行之后仅 1 次它们不接收实体上下文适合做汇总统计、批量上报等一次性工作例如统计本次提交共处理了多少条实体变更避免为每个实体重复执行相同逻辑。六、常见问题 FAQQ1为什么不能像普通触发器那样全自动事务触发器的时机依赖你显式开启的事务边界库无法猜测你在哪一行Commit所以必须手动调用BeginTransaction并在提交/回滚前后手动触发。这也是官方说明中想手动控制 TriggerSession 时无法继承 TriggeredDbContext的原因。Q2AfterCommit 里再调用 SaveChanges 会怎样那是一次全新的独立保存新事务不会再触发当前会话的 BeforeCommit/AfterCommit。注意别把必须随原事务提交的数据放进 AfterCommit 中写入。Q3事务触发器会级联吗不会。实现上统一采用非级联发现策略NonCascadingTriggerContextDiscoveryStrategy见 TriggeredSessionExtensions.cs保证事务边界处的触发逻辑简单、可预测。Q4支持哪些版本当前稳定线 V3 面向 EF Core 6.NET 6V2 面向 EF Core 3.1构建说明见 CLAUDE.md。七、源码快速导航想了解什么去哪里看8 个触发器接口的定义src/EntityFrameworkCore.Triggered.Transactions.Abstractions/生命周期接口src/EntityFrameworkCore.Triggered.Transactions.Abstractions/Lifecycles/Raise* 扩展方法实现TriggeredSessionExtensions.csUseTransactionTriggers 注册逻辑TriggersContextOptionsBuilderExtensions.cs触发器行为单元测试TriggeredSessionExtensionsTests.cs基础触发器Before/AfterSave用法README.md掌握以上内容你就能够在 EntityFrameworkCore.Triggered 的基础上精确控制数据落库那一刻的业务逻辑让通知、事件与缓存永远和数据库事务保持一致。✅【免费下载链接】EntityFrameworkCore.TriggeredTriggers for EFCore. Respond to changes in your DbContext before and after they are committed to the database.项目地址: https://gitcode.com/gh_mirrors/en/EntityFrameworkCore.Triggered创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

第226篇 轨迹优化基础——什么是“好的“轨迹

第226篇 轨迹优化基础——什么是“好的“轨迹

前面几篇讲了混合A*、Reed-Shepp曲线、泊车应用——这些解决的是"路径存在性"问题,即找到一条能从A到B的路。从今天开始进入新话题:轨迹优化。说白了,路径规划回答"走哪条路",轨迹优化回答"怎么走这条路…

2026/8/22 15:52:26 阅读更多 →
新生自动报名所有必修课:EntityFrameworkCore.Triggered级联触发器实战演示

新生自动报名所有必修课:EntityFrameworkCore.Triggered级联触发器实战演示

新生自动报名所有必修课:EntityFrameworkCore.Triggered级联触发器实战演示 【免费下载链接】EntityFrameworkCore.Triggered Triggers for EFCore. Respond to changes in your DbContext before and after they are committed to the database. 项目地址: https…

2026/8/22 15:52:26 阅读更多 →
怎么让文心做表格?AI导出鸭苹果版将文心输出的管道表格智能解析为二维结构,一键导出为Excel或Word标准表格

怎么让文心做表格?AI导出鸭苹果版将文心输出的管道表格智能解析为二维结构,一键导出为Excel或Word标准表格

怎么让文心做表格?AI导出鸭苹果版将文心输出的管道表格智能解析为二维结构,一键导出为Excel或Word标准表格。正文 文心一言(ERNIE)作为百度旗下AI助手,生成表格时通常采用Markdown管道语法,例如&#xff1a…

2026/8/22 15:51:26 阅读更多 →

最新新闻

SMO算法二元子问题解析解的原理与工程实践

SMO算法二元子问题解析解的原理与工程实践

1. 为什么SMO算法里非得用解析法解这个二次子问题?——从拉格朗日乘子更新的本质说起你翻过《统计学习方法》第7章,也看过Platt原始论文里那几行密密麻麻的公式,但真正卡住你的,不是KKT条件,也不是核函数,而…

2026/8/23 21:17:16 阅读更多 →
基于图神经网络与场景上下文的车辆早期减速行为分类方法

基于图神经网络与场景上下文的车辆早期减速行为分类方法

1. 项目概述:从轨迹数据中预见城市交通的“慢动作”在自动驾驶和智能交通系统的研发中,理解车辆在复杂城市环境下的行为,尤其是减速行为,是一个核心且极具挑战性的问题。减速不仅仅是踩下刹车那么简单,它背后是驾驶员或…

2026/8/23 21:17:16 阅读更多 →
AI智能体动作边界评测:SteerBench-Work基准的设计与应用

AI智能体动作边界评测:SteerBench-Work基准的设计与应用

1. 项目概述:为什么我们需要一个“动作边界”的评测基准?最近在AI智能体(Agent)的圈子里,大家讨论的热点已经从“能不能完成任务”转向了“任务完成得怎么样”。我们训练一个智能体,比如让它操作一个软件或…

2026/8/23 21:17:16 阅读更多 →
基于YOLOv5的目标分类计数与可视化系统实战指南

基于YOLOv5的目标分类计数与可视化系统实战指南

1. 项目概述与核心价值最近在做一个工业质检的小项目,需要实时统计流水线上不同缺陷类型的数量,并把结果直接“画”在监控画面上。这听起来是个很常见的需求,对吧?但真上手做,你会发现从“检测出来”到“清晰、准确、实…

2026/8/23 21:17:16 阅读更多 →
工业自动化五大核心软件协同:从电气设计到MES的数据流解析

工业自动化五大核心软件协同:从电气设计到MES的数据流解析

最近在整理一个工业自动化项目时,我遇到了一个典型问题:现场工程师发来一份设备清单,里面混杂着PLC程序、电气图纸、组态画面和一堆数据记录。我需要快速理解整个系统的逻辑,并定位一个偶发的通讯故障。面对十几个G的工程文件&…

2026/8/23 21:17:16 阅读更多 →
微服务架构下分布式事务解决方案:从2PC到Seata AT模式实战

微服务架构下分布式事务解决方案:从2PC到Seata AT模式实战

1. 从单体到微服务:为什么分布式事务成了绕不开的坎几年前,我们团队还在维护一个庞大的单体应用。所有的业务逻辑、用户数据、订单信息都挤在一个数据库里。那时候,处理一个“下单减库存”的业务,无非就是在一个数据库连接里&…

2026/8/23 21:16:16 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →