我只是偶然发现了Audit.Net,我被迷住了。我浏览了Audit.Net实体框架(6)文档,在输出部分中有点迷失了。
我的解决方案是多层设计:
参考资料:我的EDMX名为Focus
用法
我设法从以下位置修改FocusModel.Context.tt:
partial class <#=code.Escape(container)#> : DbContext至:
partial class <#=code.Escape(container)#> : Audit.EntityFramework.AuditDbContext配置
我发现模式的默认设置,IncludeEntityObjects,& AuditEventType符合我的喜好。包含/忽略实体/属性的属性也很简单。
输出
这就是我困惑的地方。我需要对同一数据库进行审计,最好是对选定实体的审计表进行审计。我数据库中的每个实体都有复合的PKs。如何在此场景中设置输出模式?而且,在我的解决方案设置中,WCF服务背后的所有项目的起点都是WCF服务本身。这是否意味着Fluent-API配置Audit.Net的要点就在这里?
发布于 2018-05-26 06:53:01
你见过主要的Audit.NET文档,特别是输出数据提供者吗?
我需要对同一数据库进行审计,最好是对选定实体的审计表进行审计。我数据库中的每个实体都有复合的PKs。
所以你可以使用EF数据提供者。它适用于任何类型的主键。
如何在此场景中设置输出模式?
我不知道输出模式是什么意思,但我猜您要求OptIn/OptOut忽略要审计的审计实体。如果是这样的话,您有多个选项,比如在审计POCO类上使用AuditIgnore属性,或者通过fluent-api OptIn()/OptOut()方法。见下面的例子。
WCF服务背后的所有项目的起点是WCF服务本身。这是否意味着Fluent-API配置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();
}将产生以下内容:

https://stackoverflow.com/questions/50537401
复制相似问题