我偶然发现了Audit.Net,我迷上了。我浏览了Audit.Net Entity Framework(6)文档,在输出部分有点丢失。
我的解决方案有点多层设计:
参考:我的EDMX名为Focus
我设法从:
修改FocusModel.Context.ttpartial class <#=code.Escape(container)#> : DbContext
要:
partial class <#=code.Escape(container)#> : Audit.EntityFramework.AuditDbContext
我找到了Mode,IncludeEntityObjects和&amp;的默认设置。 AuditEventType是我喜欢的。包含/忽略实体/属性的属性也很简单。
这是我很困惑的地方。我需要审核到同一个数据库,最好是审核所选实体的表。我的数据库中的每个实体都有复合PK。如何在此方案中设置输出模式?此外,在我的解决方案设置中,WCF服务背后的所有项目的起点是WCF服务本身。这是否意味着Fluent-API-configure Audit.Net的重点在这里?
答案 0 :(得分:0)
您是否看过主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)
{
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();
}
将生成以下内容: