首页 > 解决方案 > 如何使用 ASP 更新用户详细信息。NET 核心 MVC?并发失败

问题描述

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

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

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

我怎样才能使它起作用?

放置方法

[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.netasp.net-coreasp.net-web-apiconcurrency

解决方案


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

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

或者只是使用UserManager<TUser>.GetUserAsync和更新返回用户的字段:

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

推荐阅读