Настройка для выборочного аудита в том же DbContext - PullRequest
0 голосов
/ 26 мая 2018

Я только что наткнулся на Audit.Net и меня зацепило.Я просмотрел документацию по Audit.Net Entity Framework (6) и немного растерялся в части вывода.

Мое решение - немного многослойный дизайн:

  • Mvc 5веб-сайт
  • Wcf Client
    • Использование WcfClientProxyGenerator
  • Wcf Service
    • Отдельная библиотека IService Contracts
    • Все интерфейсы доступныБДО
  • Бизнес-логика
    • Отдельная библиотека БДО
  • Доступ к данным
    • Ссылка 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 и AuditEventType, которые мне понравились.атрибут «Включить / игнорировать сущности / свойства» также был простым.

Вывод

Это то, где я запутался.Мне нужно провести аудит в одной и той же базе данных, желательно в таблицах аудита для выбранных объектов.Каждая сущность в моей базе данных имеет составные PK.Как мне установить режим вывода в этом сценарии?Кроме того, в моей настройке решения отправной точкой для всех проектов, которые находятся за Службой WCF, является сама служба WCF.Означает ли это, что точка для настройки Fluit-API Audit.Net здесь?

1 Ответ

0 голосов
/ 26 мая 2018

Вы видели основную документацию по Audit.NET , в частности поставщики выходных данных ?

Мне нужно провести аудит в той же базе данных, предпочтительно чтобыТаблицы аудита для выбранных организаций.Каждая сущность в моей базе данных имеет составные PK.

Таким образом, вы можете использовать EF data provider .Он работает с любым типом первичного ключа.

Как настроить режим вывода в этом сценарии?

Я не уверен, что вы подразумеваете под режимом вывода , но я предполагаю, что вы спрашиваете об OptIn / OptOut, чтобы игнорировать ваши объекты аудита для аудита.Если это так, у вас есть несколько вариантов, например, использование атрибута AuditIgnore в ваших классах POCO аудита или с помощью методов fluent-api OptIn() / OptOut().См. Пример ниже.

Отправной точкой для всех проектов, которые находятся за Службой WCF, является сама служба WCF.Означает ли это, что точка для настройки Fluit-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();
}

Будет сгенерировано следующее:

enter image description here

...