你见过主要的Audit.NET documentation,特别是output data providers吗?
我需要审计同一个数据库,最好是审计选定实体的表。我数据库中的每个实体都有复合 PK。
因此您可以使用EF data provider。它适用于任何类型的主键。
在这种情况下如何设置输出模式?
我不确定 输出模式 是什么意思,但我猜你询问 OptIn/OptOut 以忽略要审计的审计实体。如果是这种情况,您有多种选择,例如在审计 POCO 类上使用 AuditIgnore 属性,或通过 fluent-api OptIn()/OptOut() 方法。请参见下面的示例。
WCF 服务背后的所有项目的起点都是 WCF 服务本身。这是否意味着 Fluent-API-configure Audit.Net 的重点就在这里?
您可以在任何地方配置 Audit.NET 库,但必须在创建任何审核事件之前进行,因此建议在您的应用或服务启动后立即在您的启动代码中。
示例代码
以下是显示如何配置 Audit.NET 和 Audit.EntityFramework 库的最小示例。
假设您有以下架构:
public class Student
{
public int PK_1 { get; set; }
public string PK_2 { get; set; }
public string Name { get; set; }
}
public class Student_Audit
{
public int PK_1 { get; set; }
public string PK_2 { get; set; }
public string Name { get; set; }
public DateTime AuditDate { get; set; }
public string AuditAction { get; set; }
}
public class SchoolContext : AuditDbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder) //<--Tip: its not DbModelBuilder, its Microsoft.EntityFrameworkCore.ModelBuilder
{
modelBuilder.Entity<Student>().HasKey(c => new { c.PK_1, c.PK_2 });
modelBuilder.Entity<Student_Audit>().HasKey(c => new { c.PK_1, c.PK_2, c.AuditDate });
}
public DbSet<Student> Students { get; set; }
public DbSet<Student_Audit> Students_Audit { get; set; }
}
您可以按如下方式在启动代码上配置库:
// Setup audit to use the EF data provider
Audit.Core.Configuration.Setup()
.UseEntityFramework(_ => _
.AuditTypeExplicitMapper(m => m
// Map Student to Student_Audit
.Map<Student, Student_Audit>((ev, ent, studentAudit) =>
{
//add the action name and the date to the audit entity
studentAudit.AuditAction = ent.Action;
studentAudit.AuditDate = DateTime.UtcNow;
})));
// Configure the EF audit behavior
Audit.EntityFramework.Configuration.Setup()
.ForContext<SchoolContext>(_ => _.IncludeEntityObjects())
.UseOptOut()
.Ignore<Student_Audit>(); // Do not audit the audit tables
还有一个测试用例:
using (var db = new SchoolContext())
{
db.Database.EnsureCreated();
var st = new Student() { PK_1 = 1, PK_2 = "one", Name = "John" };
db.Students.Add(st);
db.SaveChanges();
}
将生成以下内容: