Audit.Net实体框架提供程序:在审核日志之前保存数据库操作

时间:2019-01-23 14:59:53

标签: audit.net

我一直在尝试使用https://github.com/thepirat000/Audit.NET/tree/master/src/Audit.EntityFramework#without-inheritance中概述的Audit.NET实体框架提供程序而不使用继承

有没有一种方法可以先保存数据库操作,然后再创建AuditEvent?我注意到,如果您配置了数据库约束,则仍然会触发Audit事件,而DbContext.SaveChangesAsync会在主线程上引发异常。

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

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));

它可以正常工作,但是审核在数据库操作之前进行。我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

在正常情况下,默认情况下,审计保存发生在DbContext.SaveChanges返回后的 之后。您可以检查代码here

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

您不应使用第一种方法,而应仅在替代项上调用_helper.SaveChanges