Могу ли я настроить Audit. NET для создания записей аудита в двух таблицах для одного события аудита? - PullRequest
1 голос
/ 08 мая 2020

В настоящее время я внедряю Audit. NET в проект ASP. NET Core Web API, который использует EF Core. Я использую Entity Framework Data Provider , и в настоящее время он настроен для сопоставления всех сущностей с одной таблицей журнала аудита (AuditLog) с приведенным ниже кодом.

Audit.Core.Configuration.Setup()
.UseEntityFramework(_ => _
    .AuditTypeMapper(t => typeof(AuditLog))  
    .AuditEntityAction<AuditLog>((ev, entry, audit) =>
    {
        audit.Date = DateTime.UtcNow;
        audit.AuditData = JsonConvert.SerializeObject(entry);
        audit.UserIdentifier = userId;
    })
.IgnoreMatchedProperties(true));

Это работает отлично, однако я хотел бы записывать записи аудита в таблицу BlogApprovals, если тип объекта Blog - в дополнение к записи, добавляемой в AuditLog. Итак, для объекта Blog я хотел бы, чтобы запись аудита была в как BlogApprovals, так и AuditLog. Возможно ли это?

1 Ответ

1 голос
/ 09 мая 2020

Не совсем, поскольку EntityFrameworkDataProvider предназначен для сопоставления каждой сущности только с одной аудиторской сущностью.

Но вы можете активировать дополнительную вставку после завершения операции, используя OnSaving Пользовательское действие , например:

Audit.Core.Configuration.AddOnSavingAction(scope =>
{
    // OnSaving event fires after context SaveChanges 
    var efEvent = (scope.Event as AuditEventEntityFramework)?.EntityFrameworkEvent;
    if (efEvent != null && efEvent.Success)
    {
        foreach (var e in efEvent.Entries)
        {
            if (e.Table == "Blogs" && e.Action == "Insert")
            {
                // there was an insert on blogs table, insert the blogapproval
                var ctx = efEvent.GetDbContext() as MyContext;
                ctx.BlogApproval.Add(new BlogApproval() { Note = "note..." });
                (ctx as IAuditBypass).SaveChangesBypassAudit();
            }
        }
    }
});
...