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

它是在调用SaveChanges或SaveChangesAsync前后自动触发的钩子,不用改DbContext代码就能统一处理数据变更逻辑。比如自动填充创建/更新时间、记录谁改了数据、做业务校验、写审计日志,甚至临时阻止非法保存。
在DI容器配置DbContext时,用AddInterceptors方法注入实现类:
Program.cs里这样写:services.AddDbContext
options.UseSqlServer(connectionString)
.AddInterceptors(new AuditSaveChangesInterceptor()));
ConfigureDbContext避免服务解析问题:builder.ConfigureDbContext
options.AddInterceptors(provider.GetRequiredService
实现ISaveChangesInterceptor接口,重点关注两个方法:
SuppressWithResult中断保存示例:自动设置UpdatedAt字段
public class AuditSaveChangesInterceptor : ISaveChangesInterceptor
{
public InterceptionResult
{
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会跳过后续操作——这适合做权限拦截或软删除替代。
基本上就这些。
以上就是EF Core SaveChanges拦截器怎么用 EF Core ISaveChangesInterceptor教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号