有没有办法添加多个SaveChangesInterceptor

问题描述 投票:0回答:1

我已经有一个 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>();

执行进入可审核拦截器,但不经过软删除拦截器

entity-framework-core .net-7.0
1个回答
0
投票

我根据@Svyatoslav评论将拦截器注册到DbContext并且它有效,代码如下

private readonly AuditableEntitySaveChangesInterceptor _auditableEntitySaveChangesInterceptor;
private readonly SoftDeletableEntitySaveChangesInterceptor _softDeletableEntitySaveChangesInterceptor;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
   optionsBuilder.AddInterceptors(_auditableEntitySaveChangesInterceptor);
   optionsBuilder.AddInterceptors(_softDeletableEntitySaveChangesInterceptor);
}
© www.soinside.com 2019 - 2024. All rights reserved.