MVC 6中间件使用实体框架更改数据(保存用户的最后操作日期时间)

时间:2016-01-17 18:30:58

标签: asp.net asp.net-mvc entity-framework-core

在开发我的网络应用程序期间,我需要保存用户'最后行动日期/时间。 我以为我会在身份验证服务之后添加一个中间件。 看起来有点像这样:

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

0 个答案:

没有答案