在开发我的网络应用程序期间,我需要保存用户'最后行动日期/时间。 我以为我会在身份验证服务之后添加一个中间件。 看起来有点像这样:
public class LogUserActivityMiddleware
{
private readonly RequestDelegate _next;
private readonly ApplicationDbContext _db;
private readonly UserManager<ApplicationUser> _manager;
public LogUserActivityMiddleware(ApplicationDbContext db, UserManager<ApplicationUser> manager, RequestDelegate next)
{
_db = db;
_manager = manager;
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.User.Identity.IsAuthenticated)
{
var user = _db.Users
.Where(u => string.Equals(u.NormalizedUserName,
context.User.Identity.Name,
StringComparison.InvariantCultureIgnoreCase))
.Single();
if (user != null)
{
user.LastActionDate = DateTime.UtcNow;
_db.SaveChanges();
}
}
await _next.Invoke(context);
}
}
在有人试图更新某个数据之前,它可以正常工作。然后我得到DbUpdateConcurrencyException。是因为用户所做的更改还不在数据库中吗?如何以任何其他方式保存动作时间?
编辑: 我使用方法更新LastActionDate扩展了用户管理器类,它在中间件中停止了中断,但现在在使用用户表上的dbContext的任何控制器方法中抛出异常。 例如
var user = db.Users.Where(u => u.Id == "ID").Single();
user.DisplayName = "New nickname";
db.SaveChanges(); //I get an exception here now