Audit.Net Entity Framework Provider: 保存审计日志前的DB操作

Audit.Net Entity Framework Provider: Save the DB operation before the audit log

我一直在尝试不使用继承的 Audit.NET Entity Framework 提供程序,https://github.com/thepirat000/Audit.NET/tree/master/src/Audit.EntityFramework#without-inheritance

中对此进行了概述

有没有办法先保存数据库操作,然后创建AuditEvent?我注意到,如果您配置了数据库约束,审计事件仍然会触发,而 DbContext.SaveChangesAsync 会在主线程上抛出异常。

此代码段执行数据库操作,但不触发审计事件:

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        try
        {   
            int saveResult = await base.SaveChangesAsync(cancellationToken);
            return await _helper.SaveChangesAsync(_auditContext, () => Task.FromResult(saveResult));
        }
        catch (Exception)
        {
            throw;
        }
    }

但是如果我将这两行替换为

return await _helper.SaveChangesAsync(_auditContext, () => base.SaveChangesAsync(cancellationToken));

它工作正常,但审计发生在数据库操作之前。我在这里错过了什么?

在正常情况下,默认情况下,审核保存发生在 DbContext.SaveChanges returns 之后。您可以查看代码here

作用域创建在数据库操作之前完成,但是直到上下文完成操作后才会触发审计保存。

你不应该使用第一种方法,你应该只在覆盖时调用 _helper.SaveChanges