【问题标题】:How to update user details using ASP. NET Core MVC? ConcurrencyFailure如何使用 ASP 更新用户详细信息。 NET 核心 MVC?并发失败
【发布时间】:2020-06-27 10:02:41
【问题描述】:

我正在尝试使用 ASP.NET Core MVC 和 Angular 从 SQL 数据库更新用户详细信息。我想在不将 UserID 发送到 API 的情况下更新用户,因此我必须在 PUT 方法中获取 UserId。 我使用实体和身份来创建数据库。

使用以下代码我收到此错误:

Code: "ConcurrencyFailure"
Description: "Optimistic concurrency failure, object has been modified."

我怎样才能使它起作用?

PUT 方法

[HttpPut]
        [Route("Update")]
        //api/ApplicationUser/Update

        public async Task<Object> PutApplicationUser(UserAccountModel model)
        {
            var user = _userManager.GetUserId(HttpContext.User);
            
            var applicationUser = new UserAccount()
            {
                UserName = model.UserName,
                FirstName = model.FirstName,
                LastName = model.LastName,
                Email = model.Email,
                PhoneNumber = model.PhoneNumber,
                VerificationCode = "",
                ExpCode = new DateTime(2020, 8, 18),
                SecurityStamp = Guid.NewGuid().ToString()
               
            };

            try
            {
                var result = await _userManager.UpdateAsync(applicationUser);
                
                return result;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

用户帐户模型

    public class UserAccount : IdentityUser
    {
        [Column(TypeName = "nvarchar(30)")]
        public string FirstName { get; set; }

        [Column(TypeName = "nvarchar(30)")]
        public string LastName { get; set; }

        [Column(TypeName = "nvarchar(30)")]
        public string VerificationCode { get; set; }

        [Column(TypeName = "smalldatetime")]
        public DateTime ExpCode { get; set; }

        public virtual ICollection<File> File { get; set; }

        public virtual ICollection<Folder> Folder { get; set; }
    }

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api concurrency


    【解决方案1】:

    尝试为该用户获取ConcurrencyStamp 并将其设置为您的更新模型:

            var user = _userManager.GetUserId(HttpContext.User);
            var currStamp = ... // somehow get current stamp
            var applicationUser = new UserAccount()
            {
                ...
                ConcurrencyStamp = currStamp 
            };
    

    或者只使用UserManager&lt;TUser&gt;.GetUserAsync 并更新返回用户的字段:

    var user = await _userManager.GetUserAsync(HttpContext.User);
    user.UserName = model.UserName;
    .....
    var result = await _userManager.UpdateAsync(user);
    

    【讨论】:

    • 如果我返回await _userManager.GetUserAsync(HttpContext.User);,则值为空。所以可能我没有正确获得价值。
    • @Eduard var user = _userManager.GetUserId(HttpContext.User); 返回什么?
    • 204 无内容。
    • @Eduard 值由_userManager.GetUserId 设置为user204 No Content.?你确定吗?
    • @Eduard 请参阅this
    【解决方案2】:

    我认为您应该更新存在的记录。这有效:

    string user = User.Claims.First(c => c.Type == "UserID").Value; 
    var userModel = await _userManager.FindByIdAsync(user);
    userModel.model.UserName;
    userModel.FirstName = model.FirstName;
    userModel.LastName = model.LastName;
    userModel.Email = model.Email;
    userModel.PhoneNumber = model.PhoneNumber;
    userModel.VerificationCode = "";
    userModel.ExpCode = new DateTime(2020, 8, 18);
    

    【讨论】:

    • 我假设 GetUserId 返回用户 ID。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2019-06-24
    • 2019-01-18
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多