首页 > 解决方案 > Audit.Net Entity Framework Provider:在审核日志之前保存 DB 操作

问题描述

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

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

此代码段执行 DB 操作,但不会触发 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));

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

标签: audit.net

解决方案


在正常情况下,默认情况下,审计保存发生在退货之后DbContext.SaveChanges。你可以在这里查看代码。

范围创建在 DB 操作之前完成,但在上下文完成操作之前不会触发审计保存。

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


推荐阅读