如何添加多个SaveChangesInterceptor?审计拦截器生效软删除拦截器未执行
解决EF Core多个SaveChangesInterceptor仅一个生效的问题
问题原因
你已将两个拦截器注册到依赖注入容器,但EF Core不会自动将所有注册的SaveChangesInterceptor实例关联到DbContext。必须显式将拦截器添加到DbContext的配置中,否则只有被添加的拦截器会生效。
解决方案
修改DbContext的注册代码,在配置选项中通过AddInterceptors方法同时注入两个拦截器:
services.AddDbContext<YourDbContext>((serviceProvider, options) => { // 替换为你的数据库连接配置 options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")) // 添加两个拦截器 .AddInterceptors( serviceProvider.GetRequiredService<AuditableEntitySaveChangesInterceptor>(), serviceProvider.GetRequiredService<SoftDeletableEntitySaveChangesInterceptor>() ); });
额外注意事项
- 拦截器执行顺序:上述代码中软删除拦截器会先执行,将
Deleted状态改为Modified,之后审计拦截器会捕获到Modified状态的实体,自动更新LastModified和LastModifiedBy字段,这个顺序符合业务逻辑。 - 实体继承关系:确保
BaseAuditableSoftDeletableEntity继承自BaseAuditableEntity,这样软删除后的实体能被审计拦截器正确处理。 - 目标实体类型:测试删除操作时,要确保被删除的实体确实是
BaseAuditableSoftDeletableEntity的实例,否则软删除拦截器的Entries<BaseAuditableSoftDeletableEntity>()不会匹配到对应的实体条目。 - Scope一致性:保持拦截器的注册范围(Scoped)与DbContext一致,避免生命周期不匹配的问题。
内容的提问来源于stack exchange,提问作者Ayman Hussam
相关产品推荐
相关产品推荐

