Audit.Net:保存主记录时审计记录不回滚抛出 DbUpdateException

Audit.Net: Audit Record Not Rolling Back When saving master record throws DbUpdateException

我一直在我的 .Net Core v2.2 Web 中使用 Audit.EntityFramework.Core v14.6.3 API。

当我更新 table 记录时,由于 table 中的检查约束冲突,它抛出了 dbUpdateException 错误。虽然主记录没有像我预期的那样保存到数据库中,但审计记录通过并插入到审计中 table。

我很好奇为什么审计记录没有和主记录一起回滚。是否还有其他 implementation/configuration 需要完成?

我已经映射了所有主 table 各自的审计 table:

var optionsBuilder = new Microsoft.EntityFrameworkCore.DbContextOptionsBuilder<DGAuditDBContext>();           optionsBuilder.UseSqlServer(EncryptionManager.DecryptKey(Microsoft.Extensions.Configuration.ConfigurationExtensions.GetConnectionString(this._configuration, "localhost")));
                    Audit.Core.Configuration.Setup()
                        .UseEntityFramework(ef => ef
                           .UseDbContext<DGAuditDBContext>(optionsBuilder.Options)
                           .AuditTypeExplicitMapper(m => m
                              .Map<AdmissionType, Audit_AdmissionType>()
                              .AuditEntityAction((evt, entry, auditEntity) =>
                               {
                                   ((dynamic)auditEntity).AuditDate = DateTime.UtcNow;
                                   ((dynamic)auditEntity).UserID = user_name;
                                   ((dynamic)auditEntity).AuditAction = entry.Action;
                               })
                           )
                        );

我的 dbcontext 中的配置:

public class DGDBContext : IdentityDbContext<AppUser> {

        private static DbContextHelper _helper = new DbContextHelper ();
        private readonly IAuditDbContext _auditContext;
        protected override void OnConfiguring (DbContextOptionsBuilder optionsBuilder) {

            optionsBuilder.EnableSensitiveDataLogging ();

            base.OnConfiguring (optionsBuilder);
        }

        public DGDBContext (DbContextOptions<DGDBContext> options) : base (options) {
        
                    _auditContext = new DefaultAuditContext (this);
                    _helper.SetConfig (_auditContext);
                }
                public override int SaveChanges () {
                    return _helper.SaveChanges (_auditContext, () => base.SaveChanges ());
                }
        
                public override async Task<int> SaveChangesAsync (CancellationToken cancellationToken = default (CancellationToken)) {
                    return await _helper.SaveChangesAsync (_auditContext, () => base.SaveChangesAsync (cancellationToken));
                }
        
        public DbSet<AdmissionType> AdmissionType{ get; set; }
        public DbSet<Audit_AdmissionType> Audit_AdmissionType{ get; set; }
}

任何 idea/help 将不胜感激。

无论 SaveChanges 操作的结果如何,Audit.EntityFramework helper/context 都会触发审核事件。所以默认情况下它会尝试保存失败的事件。

但您可以将 AuditEntityAction 更改为 return 布尔值以指示是否应包含或丢弃审计,并使其依赖于 EF 事件的成功字段:

    .AuditEntityAction((ev, entry, auditEntity) =>
    {
      // ...

      return (ev as AuditEventEntityFramework).EntityFrameworkEvent.Success;
    })