首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一DbContext中选择性审计的设置

同一DbContext中选择性审计的设置
EN

Stack Overflow用户
提问于 2018-05-25 22:04:46
回答 1查看 1.2K关注 0票数 1

我只是偶然发现了Audit.Net,我被迷住了。我浏览了Audit.Net实体框架(6)文档,在输出部分中有点迷失了。

我的解决方案是多层设计:

  • Mvc 5网站
  • Wcf客户端
    • 使用WcfClientProxyGenerator

  • Wcf服务
    • 单独的IService合同库
    • 所有接口都公开BDO

  • 业务逻辑
    • 分离BDO文库

  • 数据访问
    • 参考EF6
    • 参考Audit.Net
    • DTO

  • 实体框架库
    • 只有EDMX
    • 参考Audit.Net

参考资料:我的EDMX名为Focus

用法

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

代码语言:javascript
复制
partial class <#=code.Escape(container)#> : DbContext

至:

代码语言:javascript
复制
partial class <#=code.Escape(container)#> : Audit.EntityFramework.AuditDbContext

配置

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

输出

这就是我困惑的地方。我需要对同一数据库进行审计,最好是对选定实体的审计表进行审计。我数据库中的每个实体都有复合的PKs。如何在此场景中设置输出模式?而且,在我的解决方案设置中,WCF服务背后的所有项目的起点都是WCF服务本身。这是否意味着Fluent-API配置Audit.Net的要点就在这里?

EN

回答 1

Stack Overflow用户

发布于 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库的最小示例。

假设您有以下模式:

代码语言:javascript
复制
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; }
}

可以在启动代码上配置库,如下所示:

代码语言:javascript
复制
// 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

还有一个测试用例:

代码语言:javascript
复制
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();
}

将产生以下内容:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50537401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档