Audit.EntityFramework配合EF Core操作MySQL无法生成审计日志如何解决?
审计日志不生成问题排查及修复方案
以下是你配置中常见的遗漏项及对应修复方案:
- 未重写同步
SaveChanges方法:你当前只重写了SaveChangesAsync,如果业务代码中调用了同步版本的SaveChanges,审计逻辑不会触发,需要补充同步方法的重写。 - 未在DbContext中注册
AuditLog实体:必须在自定义DbContext中添加DbSet<AuditLog>属性,否则EF Core无法识别审计实体,无法将日志写入对应表。 - 未指定需要审计的实体范围:默认不会自动审计所有实体,你可以选择在需要审计的实体类上添加
[AuditInclude]特性,或者在全局配置中开启IncludeAllEntities()审计所有实体。 - 配置初始化顺序错误:
Audit.Core.Configuration的配置必须放在应用启动的最早期,优先于DbContext的初始化逻辑,如果配置放在DbContext构造函数或者服务注册之后,可能不生效。 - 审计逻辑内部异常被吞:你当前的
TablePk取值直接取主键的第一个值,如果遇到复合主键、未生成主键(如自增ID未提交前无值)的场景会抛出异常,可能导致审计逻辑中断,建议改为兼容复合主键的写法。 - 依赖包安装错误:确认你已经安装了适配EF Core的NuGet包
Audit.EntityFramework.Core,不要误装.NET Framework版本的相关包。
修正后的代码示例
全局审计配置(放在Program.cs应用启动最前端)
Audit.Core.Configuration.Setup() .IncludeAllEntities() // 全局审计所有实体,不需要可删除,改为给实体加[AuditInclude]特性 .UseEntityFramework(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.EntityType = entry.EntityType.Name; entity.AuditDate = DateTime.Now; entity.AuditUser = Environment.UserName; // 兼容复合主键场景 entity.TablePk = string.Join(",", entry.PrimaryKey.Select(pk => pk.Value?.ToString())); }) .IgnoreMatchedProperties(true));
修正后的DbContext代码
public class MyContext : DbContext { private readonly DbContextHelper _helper = new DbContextHelper(); private readonly IAuditDbContext _auditContext; // 注册审计日志实体 public DbSet<AuditLog> AuditLogs { get; set; } public MyContext(DbContextOptions<MyContext> options) : base(options) { _auditContext = new DefaultAuditContext(this); _helper.SetConfig(_auditContext); } public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return await _helper.SaveChangesAsync(_auditContext, () => base.SaveChangesAsync(cancellationToken)); } // 补充同步SaveChanges的重写 public override int SaveChanges() { return _helper.SaveChanges(_auditContext, () => base.SaveChanges()); } }
内容的提问来源于stack exchange,提问作者Vinicius Teixeira
相关产品推荐
相关产品推荐

