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

.NET Core多项目中集成Audit.NET与EF Core的配置问题

解决方案

一、先解决审计表未生成的核心问题

Audit.NET不会自动创建审计表,你需要手动定义审计实体并通过EF迁移生成,同时确保跨项目配置正确:

1. 修正NuGet包安装

  • 包含MyDbContext的项目:必须安装Audit.EntityFramework和对应数据库的EF Core驱动(如Microsoft.EntityFrameworkCore.SqlServer)。
  • 包含实体类的子项目:必须安装Audit.EntityFramework——因为[AuditInclude]特性来自这个包,跨项目场景下不安装的话,Audit.NET无法识别该特性,这大概率是你当前的问题之一。

2. 定义统一审计表的实体

创建一个AuditLog实体,用来存储所有审计数据:

public class AuditLog
{
    public int Id { get; set; }
    public string EventType { get; set; }
    public DateTime EventDate { get; set; }
    public string UserName { get; set; }
    public string TableName { get; set; }
    public string EntityType { get; set; }
    public string Action { get; set; } // 对应Insert/Update/Delete
    public string OldValues { get; set; } // 序列化后的旧数据
    public string NewValues { get; set; } // 序列化后的新数据
    public string Changes { get; set; } // 变更明细
    public string ExtraData { get; set; } // 自定义额外信息
}

3. 在MyDbContext中配置审计表

将AuditLog添加到MyDbContext的DbSet,并配置映射:

public class MyDbContext : AuditDbContext, IApplicationDbContext
{
    public DbSet<AuditLog> AuditLogs { get; set; }

    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置AuditLog表的字段约束
        modelBuilder.Entity<AuditLog>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.EventType).HasMaxLength(100);
            entity.Property(e => e.TableName).HasMaxLength(100);
            entity.Property(e => e.EntityType).HasMaxLength(200);
            entity.Property(e => e.Action).HasMaxLength(20);
            // 根据需求调整其他字段的长度或约束
        });

        // 必须调用基类方法,确保AuditDbContext的拦截逻辑生效
        base.OnModelCreating(modelBuilder);
    }
}

之后运行EF迁移命令生成审计表:

Add-Migration AddAuditLogTable
Update-Database

4. 配置Audit.NET输出到EF Core

在Program.cs(或Startup.cs)中指定Audit.NET将审计数据写入你的AuditLog表:

Audit.Core.Configuration.Setup()
    .UseEntityFramework(config => config
        .AuditTypeMapper(_ => typeof(AuditLog)) // 指定审计数据映射到AuditLog实体
        .AuditEntityAction<AuditLog>((auditEvent, dbEntry, auditEntity) =>
        {
            // 填充审计实体的各个字段
            auditEntity.EventType = auditEvent.EventType;
            auditEntity.EventDate = auditEvent.EventDate;
            auditEntity.UserName = auditEvent.Environment.UserName;
            auditEntity.TableName = dbEntry.EntityType.Name;
            auditEntity.EntityType = dbEntry.EntityType.FullName;
            auditEntity.Action = dbEntry.Action;
            auditEntity.OldValues = dbEntry.OldValues.ToJson();
            auditEntity.NewValues = dbEntry.NewValues.ToJson();
            auditEntity.Changes = dbEntry.Changes.ToJson();
            auditEntity.ExtraData = auditEvent.ExtraData.ToJson();
        })
        .IgnoreMatchedProperties()); // 忽略AuditLog中与审计事件不匹配的属性

二、跨项目实体的额外注意事项

  • 确保MyDbContext所在项目已正确引用实体类所在的子项目,实体的命名空间能被MyDbContext识别。
  • 实体类上的[AuditInclude]特性只有在实体项目安装了Audit.EntityFramework后才会被Audit.NET识别,这点务必确认。

三、验证流程

  1. 给实体子项目安装Audit.EntityFramework包。
  2. 完成上述审计实体、DbContext配置和Audit.NET初始化。
  3. 运行EF迁移生成审计表。
  4. 对标记[AuditInclude]的TestEntity执行增删改操作,检查AuditLogs表是否有对应审计记录插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:45:29