You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:45:05