.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识别,这点务必确认。
三、验证流程
- 给实体子项目安装
Audit.EntityFramework包。 - 完成上述审计实体、DbContext配置和Audit.NET初始化。
- 运行EF迁移生成审计表。
- 对标记
[AuditInclude]的TestEntity执行增删改操作,检查AuditLogs表是否有对应审计记录插入。
内容的提问来源于stack exchange,提问作者chobo2
相关产品推荐
相关产品推荐

