在我目前工作的项目中,我需要审核对许多数据库表的更改。为此,我正在考虑使用 nuget Z.EntityFramework.Plus.Audit.EFCore。我一直在尝试,它似乎最适合我的需求。我一直在关注这里的文档。
可以像这样在我的控制器中保存审计条目:
public myFunction(){
//...
var audit = new Audit();
_context.SaveChanges(audit);
}
但如果我以这种方式这样做,那就违反了 DRY 原则。有一种方法可以覆盖 SaveChanges() 和 SaveChagesAsync() 函数,而且效果很好。这样的事情是这样完成的:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
AuditManager.DefaultConfiguration.AutoSavePreAction = (context, audit) =>
// ADD "Where(x => x.AuditEntryID == 0)" to allow multiple SaveChanges with same Audit
(context as ApplicationDbContext).AuditEntries.AddRange(audit.Entries);
}
public override int SaveChanges()
{
var audit = new Audit { }; //Problem would be here
audit.PreSaveChanges(this);
var rowAffecteds = base.SaveChanges();
audit.PostSaveChanges();
if (audit.Configuration.AutoSavePreAction != null)
{
audit.Configuration.AutoSavePreAction(this, audit);
base.SaveChanges();
}
return rowAffecteds;
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
var audit = new Audit { }; //Problem would be here
audit.PreSaveChanges(this);
var rowAffecteds = await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
audit.PostSaveChanges();
if (audit.Configuration.AutoSavePreAction != null)
{
audit.Configuration.AutoSavePreAction(this, audit);
await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
}
return rowAffecteds;
}
//... DbContext Code
}
现在这是一个更好的选择,非常干燥且更易于维护。问题是,如何获取当前用户名,以便我可以做类似的事情
var audit = new Audit { CreatedBy = "my_current_username"};
在控制器中,您可以使用指令
var username = this.User.Identity.Name;
但这在 IdentityDbContext 中不可用。我确实尝试过注入 UserManager,但它没有可能起作用的功能。
tl;博士; 当我使用 JWT 令牌时,如何在 IdentityDbContext 中获取当前用户名?