在相同的DbContext中设置选择性审核

时间:2018-05-25 22:04:47

标签: entity-framework-6 audit.net

我偶然发现了Audit.Net,我迷上了。我浏览了Audit.Net Entity Framework(6)文档,在输出部分有点丢失。

我的解决方案有点多层设计:

  • Mvc 5网站
  • Wcf客户端
    • 使用WcfClientProxyGenerator
  • Wcf服务
    • 独立的IService Contracts Library
    • 所有接口都公开BDO
  • 商业逻辑
    • 单独的BDO图书馆
  • 数据访问
    • 参考EF6
    • 参考Audit.Net
    • DTO的
  • 实体Framwework图书馆
    • 仅限EDMX
    • 参考Audit.Net

参考:我的EDMX名为Focus

用法

我设法从:

修改FocusModel.Context.tt
partial 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的重点在这里?

1 个答案:

答案 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();
}

将生成以下内容:

enter image description here