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;
})
我一直在我的 .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;
})