[英]Audit.Net Get the name of the method which called .SaveChangesAsync()
我有以下设置
Audit.Core.Configuration.Setup() // Triggered on a database save.
.UseEntityFramework(ef => ef
.AuditTypeExplicitMapper(m => m
.Map<Item, AuditLog>()
.AuditEntityAction<AuditLog>((evt, entry, auditEntity) =>
{
auditEntity.AuditData = entry.ToJson();
auditEntity.AuditDate = DateTime.UtcNow;
auditEntity.CallingMethod = "Calling Method"; <-- Where I need the calling method.
})
)
);
public async Task DoSomeWork() { //<--- I want to get "DoSomeWork"
// Some work..
await dbConn.SaveChangesAsync();
return updated;
}
我怎样才能访问调用 .saveChangesAsync 的方法,以便知道它是从哪里触发的? 我已经使用StackTrace
检查过,但是它充斥着库级框架,这些框架不是很有用,我找不到正确的父方法。
我在evt
中看到它提供了一个调用父名称,但这只是一个级别,所以只是“SaveChangesAsync”方法。
谢谢
如果您可以更改调用SaveChangesAsync
的代码并且您正在从 AuditDbContext 继承 DbContext( 高级 SaveChanges 拦截),那么您可以添加一个新的 SaveChanges 方法,其中包含一个用[CallerMemberName]
装饰的可选参数,并将调用者成员名称存储在AuditEvent 的自定义字段。
例如:
public class YourDbContext : AuditDbContext
{
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
=> throw new NotImplementedException("Should call SaveChangesAuditAsync");
public Task<int> SaveChangesAuditAsync([CallerMemberName] string memberName = "", CancellationToken cancellationToken = default)
{
this.AddAuditCustomField("Caller", memberName);
return base.SaveChangesAsync(cancellationToken);
}
}
因此,在您的 AuditEntityAction 中,您可以从自定义字段中获取调用方成员名称:
...
.AuditEntityAction<AuditLog>((evt, entry, auditEntity) =>
{
auditEntity.CallingMethod = evt.CustomFields["Caller"];
})
现在您的DoSomeWork()
必须调用新方法:
public async Task DoSomeWork()
{
...
await dbConn.SaveChangesAuditAsync();
return updated;
}
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.