我已经有一个 SaveChangesInterceptor,它负责更新审核属性,如创建日期、CreatedBy、LastModified 和 LastModifiedBy。 这是可审计的代码片段:
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = default)
{
UpdateEntities(eventData.Context);
return base.SavingChangesAsync(eventData, result, cancellationToken);
}
public void UpdateEntities(DbContext? context)
{
if (context == null) return;
foreach (var entry in context.ChangeTracker.Entries<BaseAuditableEntity>())
{
if (entry.State == EntityState.Added)
{
entry.Entity.Created = _dateTime.Now;
entry.Entity.CreatedBy = _currentUserService.UserId;
}
if (entry.State == EntityState.Added || entry.State == EntityState.Modified || entry.HasChangedOwnedEntities())
{
entry.Entity.LastModified = _dateTime.Now;
entry.Entity.LastModifiedBy = _currentUserService.UserId;
}
}
}
我想添加另一个 SaveChangesInterceptor,它将负责通过将 IsDeleted 属性设置为 true 将硬删除转换为软删除 这是软删除代码片段:
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = default)
{
SoftDeleteEntities(eventData.Context);
return base.SavingChangesAsync(eventData, result, cancellationToken);
}
public void SoftDeleteEntities(DbContext? context)
{
if (context == null) return;
var deletedEntries = context.ChangeTracker
.Entries<BaseAuditableSoftDeletableEntity>()
.Where(entry => entry.State == EntityState.Deleted)
.ToList();
foreach (var entry in deletedEntries)
{
entry.State = EntityState.Modified;
entry.Entity.IsDeleted = true;
}
}
这是依赖注入
services.AddScoped<AuditableEntitySaveChangesInterceptor>();
services.AddScoped<SoftDeletableEntitySaveChangesInterceptor>();
执行进入可审核拦截器,但不经过软删除拦截器
我根据@Svyatoslav评论将拦截器注册到DbContext并且它有效,代码如下
private readonly AuditableEntitySaveChangesInterceptor _auditableEntitySaveChangesInterceptor;
private readonly SoftDeletableEntitySaveChangesInterceptor _softDeletableEntitySaveChangesInterceptor;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.AddInterceptors(_auditableEntitySaveChangesInterceptor);
optionsBuilder.AddInterceptors(_softDeletableEntitySaveChangesInterceptor);
}