【问题标题】:Setting up for selective auditing in same DbContext在同一 DbContext 中设置选择性审计
【发布时间】:2019-07-03 11:34:34
【问题描述】:

我只是偶然发现了 Audit.Net,然后就被迷住了。我浏览了 Audit.Net Entity Framework (6) 文档,在输出部分有点迷失。

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

  • Mvc 5 网站
  • Wcf 客户端
    • 使用 WcfClientProxyGenerator
  • Wcf 服务
    • 独立的 IService 合同库
    • 所有接口都公开 BDO
  • 业务逻辑
    • 独立的 BDO 库
  • 数据访问
    • 参考 EF6
    • 参考 Audit.Net
    • DTO
  • 实体框架库
    • 只有 EDMX
    • 参考 Audit.Net

参考:我的 EDMX 名为 Focus

用法

我设法从以下位置修改 FocusModel.Context.tt:

partial class <#=code.Escape(container)#> : DbContext

收件人:

partial class <#=code.Escape(container)#> : Audit.EntityFramework.AuditDbContext

配置

我发现 Mode、IncludeEntityObjects 和 AuditEventType 的默认设置符合我的喜好。包含/忽略实体/属性的属性也很简单。

输出

这就是我感到困惑的地方。我需要审计到同一个数据库,最好是审计选定实体的表。我数据库中的每个实体都有复合 PK。在这种情况下如何设置输出模式?此外,在我的解决方案设置中,WCF 服务背后的所有项目的起点都是 WCF 服务本身。这是否意味着 Fluent-API-configure Audit.Net 的重点就在这里?

【问题讨论】:

    标签: entity-framework-6 audit.net


    【解决方案1】:

    你见过主要的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();
    }
    

    将生成以下内容:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2023-02-14
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多