audit.net - 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));
它工作正常,但审计发生在数据库操作之前。我在这里想念什么?
解决方案
在正常情况下,默认情况下,审计保存发生在退货之后DbContext.SaveChanges
。你可以在这里查看代码。
范围创建在 DB 操作之前完成,但在上下文完成操作之前不会触发审计保存。
你不应该使用第一种方法,你应该只调用_helper.SaveChanges
你的覆盖。
推荐阅读
- jolt - 颠簸转换以匹配多个键值
- reactjs - 用反应钩子构建的振荡器不会停止
- react-native - Apollo GraphQL 客户端不适用于 react native 的发布版本
- python - Python requests-html session GET 正确用法
- api - Flutter http [GET][200] 为空以获取确切的 API
- mysql - 如何在表达式中多次使用 COUNT() 实现 OVER?
- python - 如何在for循环中将一列数字转换为列表
- java - 使用 maven 构建项目时在中心找不到工件
- ffmpeg - 在 FFmpeg 中使用 mpdecimate 去除视频中的滞后峰值
- ios - 导航标题视图中的 UICollectionView 对选择没有响应