我一直在尝试使用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));
它可以正常工作,但是审核在数据库操作之前进行。我在这里想念什么?
答案 0 :(得分:0)
在正常情况下,默认情况下,审计保存发生在DbContext.SaveChanges
返回后的 之后。您可以检查代码here。
作用域的创建是在数据库操作之前完成的,但是直到上下文完成操作后才触发审计保存。
您不应使用第一种方法,而应仅在替代项上调用_helper.SaveChanges
。