【发布时间】:2018-04-09 09:57:14
【问题描述】:
在我的 C# Web API 应用程序中,我在所有表中添加了 CreatedDate 和 CreatedBy 列。现在我想在任何表中添加新记录时填充这些列。
为此,我在 DbContext 类中重写了 SaveChanges 和 SaveChangesAsync 函数,如下所示:
public class AuthDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
public override int SaveChanges()
{
AddTimestamps();
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync()
{
AddTimestamps();
return await base.SaveChangesAsync();
}
private void AddTimestamps()
{
var entities = ChangeTracker.Entries().Where(x => (x.State == EntityState.Added));
var currentUsername = !string.IsNullOrEmpty(HttpContext.Current?.User?.Identity?.Name)
? HttpContext.Current.User.Identity.Name
: "SYSTEM";
foreach (var entity in entities)
{
foreach (var propName in entity.CurrentValues.PropertyNames)
{
if (propName == "CreatedBy" && entity.State == EntityState.Added)
{
entity.CurrentValues[propName] = currentUsername;
}
else if (propName == "CreatedDate" && entity.State == EntityState.Added)
{
entity.CurrentValues[propName] = DateTime.Now;
}
}
}
}
}
现在,当我从控制器中的任何位置调用 SaveChanges 或 SaveChangesAsync 时,分配了 HttpContext.Current,我可以使用 ttpContext.Current.User.Identity.Name 从中获取用户名。但是当我使用 UserManager.UpdateAsync 函数(在我们的 DbContext 类中内部调用 SaveChangesAsync 函数)来更改底层用户表时,HttpContext.Current 设置为 null。
在这种特殊情况下如何访问 HttpContext 以获取用户名?
【问题讨论】:
-
如何调用UpdateAsync?可以展示一下吗?
-
附带说明,我强烈建议您定义一个接口,例如
IAuditable,它声明相关属性,而不是乱用字符串。同样使用DateTime.Now几乎肯定会咬你。 -
@AluanHaddad 你对使用 datetime.now 的评论,你的意思是他应该改用 DateTime.UtcNow 吗?
-
@Mart10 是的,如果足够的话,使用
DateTime.UtcNow(即您不需要在本地时间显示它们)否则您需要使用DateTimeOffset并保留一个时区. -
@AluanHaddad 完全同意你的看法。感谢指导
标签: c# asp.net-web-api