我一直在我的 .Net Core v2.2 Web API 中使用 Audit.EntityFramework.Core v14.6.3。
當我更新表記錄時,由于表中的檢查約束沖突,它引發了 dbUpdateException 錯誤。雖然主記錄沒有像我預期的那樣保存到資料庫中,但審計記錄通過并插入到審計表中。
我很好奇為什么審計記錄沒有和主記錄一起回滾。是否需要進行額外的實施/配置?
我已將所有主表映射到各自的審計表:
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; }
}
任何想法/幫助將不勝感激。
uj5u.com熱心網友回復:
Audit.EntityFramework無論 SaveChanges 操作的結果如何,幫助程式/背景關系都將觸發審計事件。所以默認情況下它會嘗試保存失敗的事件。
但是您可以更改您AuditEntityAction的回傳布林值以指示是否應包含或丟棄審計,并使其依賴于 EF 事件的 Success 欄位:
.AuditEntityAction((evt, entry, auditEntity) =>
{
// ...
return (ev as AuditEventEntityFramework).EntityFrameworkEvent.Success;
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456801.html
標籤:。网 实体框架 asp.net 核心 实体框架核心 审计网
