让审计记录变简单:用EntityFrameworkCore.Triggered快速搭建EF Core审计系统

发布时间:2026/8/22 13:54:06
让审计记录变简单:用EntityFrameworkCore.Triggered快速搭建EF Core审计系统 让审计记录变简单用EntityFrameworkCore.Triggered快速搭建EF Core审计系统【免费下载链接】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 打造的触发器Triggers库让你能够在实体保存到数据库之前和之后自动做出响应。用它搭建审计系统Audit System再也不用在每一个 Controller 里手写重复的日志代码。一、为什么审计记录总让你头疼在 EF Core 项目中你可能需要记录谁在什么时候改了这条数据哪个字段从100变成了200删除操作是真实的还是被软删除拦截了传统做法是在每个 Service/Controller 里手动比对、手动插入日志。结果是代码散落在各处漏写一处审计就断一处。EntityFrameworkCore.Triggered 的思路是把数据变动的响应逻辑从业务代码中剥离出来变成独立的触发器。只要调用SaveChanges触发器就会自动运行——审计记录从此变成顺带的事。二、触发器何时运行3个关键时机 ⏱️EntityFrameworkCore.Triggered 提供三类核心触发器接口位于 src/EntityFrameworkCore.Triggered.Abstractions 目录触发器接口运行时机典型用途IBeforeSaveTriggerT保存到数据库之前写审计记录、软删除拦截、字段填充IAfterSaveTriggerT保存到数据库之后发邮件通知、缓存更新IAfterSaveFailedTriggerT保存失败时记录异常日志每个触发器执行时都会收到一个ITriggerContextT上下文里面包含审计最需要的信息Entity当前要保存的实体UnmodifiedEntity修改前的旧值快照用来做字段级差异对比ChangeType变更类型取值Added/Modified/Deleted定义见 ChangeType.cs。有了这三样记录改了什么就变得非常直接。三、快速上手安装与注册2分钟第 1 步安装 NuGet 包在项目中安装EntityFrameworkCore.Triggered包即可。第 2 步把触发器注册到你的 DbContextservices.AddDbContextApplicationDbContext(options { options.UseTriggers(triggerOptions { triggerOptions.AddTriggerCreateAuditRecord(); }); });就一行UseTriggers()之后每次SaveChanges都会自动触发对应的审计逻辑。四、实战一个真正能用的审计系统 官方示例项目 3 - StudentManagerAspNetCore 中就内置了一套完整的审计系统值得直接借鉴。1. 定义审计表模型在 Models.cs 中Audit实体只有 4 个字段实体类型Discriminator、实体主键Id、记录时间RecordDate、以及一条人类可读的变更记录Record。简单到令人舒服。2. 用特征接口声明哪些实体需要审计IAudited.cs 定义了一个只含Id的接口。任何想要被审计的实体如Student、Course只需实现它即可。3. 编写审计触发器核心逻辑在 CreateAuditRecord.cspublic class CreateAuditRecord : IBeforeSaveAsyncTriggerIAudited { public Task BeforeSaveAsync(ITriggerContextIAudited context, CancellationToken cancellationToken) { // 对比 Entity 与 UnmodifiedEntity找出真正变化的字段 // 生成类似 DisplayName: 张三 李四 的记录并写入 Audits 表 } }它注册在IAudited接口上意味着所有实现了该接口的实体Student、Course……都会被自动审计——新增时记录全部字段修改时只记录变化的字段一行业务代码都不用改。4. 查看审计日志示例还提供了一个审计查询页面见 Pages/Audits/Index.cshtml直接读取Audits表即可看到每次数据变更的历史。五、顺手获得软删除能力 这套机制的强大之处在于可组合。同一个示例里软删除触发器 EnsureSoftDelete.cs 注册在ISoftDelete接口上当检测到ChangeType.Deleted时它不删除数据而是把DeletedOn打上时间戳并把实体状态改回Modified。于是你同时拥有了✅ 删除操作被拦截并变成软删除✅ 软删除本身也自动写入审计记录两个触发器天然协作六、进阶小技巧 执行顺序触发器支持类型继承排序父类型先于子类型执行也可以通过实现ITriggerPriority接口自定义优先级级联触发触发器修改实体后默认会继续触发相关触发器EntityAndType策略并自动防止死循环审计系统能捕捉到联动变化异步友好推荐实现异步版本接口如IAfterSaveAsyncTriggerT并配合SaveChangesAsync使用避免同步阻塞程序集扫描配合EntityFrameworkCore.Triggered.Extensions包可用AddAssemblyTriggers()一次性扫描注册整个程序集的所有触发器。写在最后用 EntityFrameworkCore.Triggered 搭建 EF Core 审计系统本质上是把手动记日志变成声明式触发一张 Audit 表 一个特征接口 一个触发器类就能覆盖整个项目的变更审计。更多细节和示例可以参考项目根目录的 README.md 以及 samples 目录下的四个完整示例。让审计自动发生把精力留给真正的业务逻辑吧✨【免费下载链接】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),仅供参考