我正在使用ASP.NET Core和EF Core,它们具有SaveChanges
和SaveChangesAsync
。
在保存到数据库之前,在我的DbContext
中,我执行一些审计/日志记录:
public async Task LogAndAuditAsync() {
// do async stuff
}
public override int SaveChanges {
/*await*/ LogAndAuditAsync(); // what do I do here???
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync {
await LogAndAuditAsync();
return await base.SaveChanges();
}
问题在于同步的SaveChanges()
方法。我一直遵循“全程异步”,但这里不可能实现。我可以重新设计
LogAndAudit()
和LogAndAuditAsync()
,但这样就不符合DRY原则了,而且我还需要更改其他十几个主要代码段,这些代码并不属于我。关于这个问题有很多其他的问题,并且所有这些问题都是普遍而复杂的,并充满争议。在这种特殊情况下,我需要知道最安全的方法。
那么,在
SaveChanges()
中,如何在不发生死锁的情况下安全同步地调用异步方法?