全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

EF Core SaveChanges拦截器怎么用 EF Core ISaveChangesInterceptor教程

SaveChanges拦截器是在调用SaveChanges或SaveChangesAsync前后自动触发的钩子,用于统一处理数据变更逻辑,如自动填充时间戳、审计日志、业务校验或阻止非法保存;通过AddInterceptors注册,实现ISaveChangesInterceptor接口的SavingChanges(保存前)和SavedChanges(保存后)方法。

SaveChanges拦截器是干什么的

它是在调用SaveChangesSaveChangesAsync前后自动触发的钩子,不用改DbContext代码就能统一处理数据变更逻辑。比如自动填充创建/更新时间、记录谁改了数据、做业务校验、写审计日志,甚至临时阻止非法保存。

怎么注册一个SaveChangesInterceptor

在DI容器配置DbContext时,用AddInterceptors方法注入实现类:

  • ASP.NET Core常规项目中,在Program.cs里这样写:

services.AddDbContext(options =>
  options.UseSqlServer(connectionString)
  .AddInterceptors(new AuditSaveChangesInterceptor()));

  • Aspire项目需用ConfigureDbContext避免服务解析问题:

builder.ConfigureDbContext((provider, options) =>
  options.AddInterceptors(provider.GetRequiredService()));

怎么写一个基础的拦截器

实现ISaveChangesInterceptor接口,重点关注两个方法:

  • SavingChanges:保存前触发,可修改实体状态、校验、或直接SuppressWithResult中断保存
  • SavedChanges:保存成功后触发,适合发通知、记日志、清理缓存

示例:自动设置UpdatedAt字段

public class AuditSaveChangesInterceptor : ISaveChangesInterceptor
{
  public InterceptionResult SavingChanges(DbContextEventData eventData, InterceptionResult result)
  {
    var context = eventData.Context;
    if (context != null)
    {
      var entries = context.ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);
      foreach (var entry in entries)
      {
        if (entry.State == EntityState.Added)
          entry.Entity.CreatedAt = DateTime.UtcNow;
        entry.Entity.UpdatedAt = DateTime.UtcNow;
      }
    }
    return result;
  }
  public void SavedChanges(DbContextEventData eventData, int result)
  {
    // 可在此处记录日志,比如“共保存5条记录”
  }
}

常见注意点

拦截器是无状态的,别在类里存实例字段;如需依赖服务(如ILogger),通过构造函数注入;多个拦截器按注册顺序执行;若在SavingChanges中返回带结果的InterceptionResult,EF会跳过后续操作——这适合做权限拦截或软删除替代。

基本上就这些。


# app  # sqlserver  # .net  # red  # NULL  # if  # foreach  # 构造函数  # int  # void  # 接口  # class  # public  # var  # 拦截器  # 是在  # 更新时间  # 就能  # 多个  # 可在  # 如需  # 改了  # 跳过  # 重点关注 


相关文章: c# 在ASP.NET Core中管理和取消后台任务  如何自定义建站之星模板颜色并下载新样式?  建站之星导航配置指南:自助建站与SEO优化全解析  宝塔新建站点报错如何解决?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何用景安虚拟主机手机版绑定域名建站?  建站之星Pro快速搭建教程:模板选择与功能配置指南  高防服务器租用首荐平台,企业级优惠套餐快速部署  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  常州企业网站制作公司,全国继续教育网怎么登录?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何在阿里云香港服务器快速搭建网站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  建站之星安装后如何自定义网站颜色与字体?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何选择高效响应式自助建站源码系统?  制作企业网站建设方案,怎样建设一个公司网站?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何快速搭建FTP站点实现文件共享?  宝塔建站无法访问?如何排查配置与端口问题?  建站之星安装后界面空白如何解决?  如何正确选择百度移动适配建站域名?  建站之星如何保障用户数据免受黑客入侵?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何通过FTP服务器快速搭建网站?  如何通过万网虚拟主机快速搭建网站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何用腾讯建站主机快速创建免费网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  广州美橙建站如何快速搭建多端合一网站?  已有域名和空间如何快速搭建网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  制作营销网站公司,淘特是干什么用的?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  已有域名能否直接搭建网站?  如何用搬瓦工VPS快速搭建个人网站?  家庭建站与云服务器建站,如何选择更优?  如何通过远程VPS快速搭建个人网站?  西安大型网站制作公司,西安招聘网站最好的是哪个?  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站之星如何配置系统实现高效建站?  建站之星后台密码遗忘?如何快速找回?  高防服务器如何保障网站安全无虞?  如何获取上海专业网站定制建站电话?  已有域名如何免费搭建网站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  ,网页ppt怎么弄成自己的ppt?  建站之星如何取消后台验证码生成? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。