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

如何将Audit.net生成的审计数据插入数据库?附现有实现代码

将Audit.NET审计数据插入数据库的可行性与实现方案

嘿,当然可行啦!你当前的代码已经基于Audit.EntityFramework.Core搭好了审计实体的映射基础,只需要补充几个关键配置步骤,就能顺利把审计数据写入你的数据库。下面是具体的实现细节和注意事项:

1. 确认AuditLog实体与数据库上下文配置

首先要确保你的AuditLog是符合EF Core要求的实体类,并且已经在DbContext中完成注册:

  • 定义AuditLog实体(可根据数据库需求调整属性类型):
    public class AuditLog
    {
        public int Id { get; set; } // 必填主键
        public string AuditData { get; set; } // 存储变更记录的JSON字符串
        public string EntityType { get; set; } // 被审计的实体类型名称
        public string AuditAction { get; set; } // 操作类型:Add/Update/Delete等
        public DateTime AuditDate { get; set; } // 审计发生时间
        public string AuditUser { get; set; } // 执行操作的用户
        public string TablePk { get; set; } // 被操作实体的主键值
    }
    
  • 在你的DbContext中添加DbSet<AuditLog>:
    public class YourDbContext : DbContext
    {
        // 其他业务实体的DbSet...
        public DbSet<AuditLog> AuditLogs { get; set; }
    
        // 上下文配置(连接字符串、模型构建等)...
    }
    
  • 执行EF Core迁移命令,创建AuditLogs表:
    Add-Migration AddAuditLogsTable
    Update-Database
    

2. 调整Audit.NET配置:选择或合并日志提供程序

你当前的代码同时配置了EntityFramework数据库提供程序和本地文件日志提供程序,这会导致审计日志同时写入数据库和本地文件。根据你的需求调整:

选项1:仅将审计数据写入数据库

移除文件日志提供程序的配置,保留EF相关逻辑即可:

AuditNet.Configuration.Setup()
    .UseEntityFramework(_ => _
        .AuditTypeMapper(t => typeof(AuditLog))
        .AuditEntityAction<AuditLog>((ev, entry, entity) => {
            entity.AuditData = entry.ToJson();
            entity.EntityType = entry.EntityType.Name;
            entity.AuditAction = entry.Action;
            entity.AuditDate = DateTime.UtcNow; // 建议用UTC时间避免时区问题
            entity.AuditUser = Environment.UserName;
            entity.TablePk = entry.PrimaryKey.First().Value.ToString();
        })
        .IgnoreMatchedProperties(true))
    .WithCreationPolicy(EventCreationPolicy.InsertOnStartReplaceOnEnd)
    .WithAction(x => x.OnScopeCreated(scope => scope.SetCustomField("ApplicationId", "People-Back Auditoria")));

选项2:同时写入数据库和文件日志

使用MultiProvider来同时启用两个日志提供程序:

AuditNet.Configuration.Setup()
    .UseMultiProvider(_ => _
        // 数据库审计提供程序
        .AddProvider(new EntityFrameworkDataProvider(_ => _
            .AuditTypeMapper(t => typeof(AuditLog))
            .AuditEntityAction<AuditLog>((ev, entry, entity) => {
                entity.AuditData = entry.ToJson();
                entity.EntityType = entry.EntityType.Name;
                entity.AuditAction = entry.Action;
                entity.AuditDate = DateTime.UtcNow;
                entity.AuditUser = Environment.UserName;
                entity.TablePk = entry.PrimaryKey.First().Value.ToString();
            })
            .IgnoreMatchedProperties(true)))
        // 文件日志提供程序
        .AddProvider(new FileLogProvider(config => config
            .FilenamePrefix("Event_")
            .Directory(@"C:\Users\Cristian Reche\source\repos\people-back")))
    )
    .WithCreationPolicy(EventCreationPolicy.InsertOnStartReplaceOnEnd)
    .WithAction(x => x.OnScopeCreated(scope => scope.SetCustomField("ApplicationId", "People-Back Auditoria")));

3. 验证审计数据写入逻辑

完成配置后,Audit.NET会自动在你执行EF Core的SaveChanges()或SaveChangesAsync()时:

  1. 捕获实体的变更记录
  2. 实例化AuditLog并填充你设置的属性
  3. 将AuditLog添加到DbContext
  4. 与主实体的变更一起提交到数据库

你只需要正常运行应用,执行增删改操作,然后检查数据库的AuditLogs表,就能看到对应的审计记录了。

关键注意事项

  • 复合主键处理:如果被审计实体使用复合主键,entry.PrimaryKey.First().Value会抛出异常,需要调整逻辑将多个主键值拼接成字符串(比如用逗号分隔)。
  • 时间时区:建议使用DateTime.UtcNow存储审计时间,后续展示时再转换为本地时间,避免跨时区环境下的时间混乱。
  • 权限检查:确保应用程序拥有数据库的写入权限,以及文件目录的读写权限(如果保留文件日志)。

内容的提问来源于stack exchange,提问作者Cristian Concatel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:03:12