簡體   English   中英

在 asp.net 內核中更新身份用戶時並發失敗

[英]Concurrency failure while updating identity user in asp.net core

在我的項目中,我使用的是 ASP.Net Core 身份。 我有一個ApplicationUser class ,它有一個Education列表。

public class ApplicationUser: IdentityUser, IEntity
    {
        public ApplicationUser()
        {
            Educations = new List<Education>();
        }
        public string Name { get; set; }   

        public DateTime DateofBirth { get; set; }
        
        public virtual List<Education> Educations { get; set; }
    }

教育

public class Education:IEntity
    {
        [Key]
        public Guid GUID { get; set; }
        public string Institution { get; set; }
        public string Degree { get; set; }
    }

我想通過 UserManager 用教育列表更新用戶。

public async Task<IActionResult> UpdateProfile(UpdateModel model)
        {
            ApplicationUser user = await _userManager.GetUserAsync(User);

            if (ModelState.IsValid)
            {
                user.Name = model.UserDetails.Name;
                user.DateofBirth = model.UserDetails.DateofBirth;
                user.Educations = model.UserDetails.Educations;
                
                var userPassword = _userManager.PasswordHasher.VerifyHashedPassword(user, 
                                    user.PasswordHash, model.Password);

                if (userPassword != PasswordVerificationResult.Success)
                {
                    ModelState.AddModelError(string.Empty, "Invalid Password.");
                    return Json("/Profile/Update");
                }
                else
                {
                    IdentityResult result = await _userManager.UpdateAsync(user);
                }
            }
            return Json("/Profile/Index");
        }

更新 Model

public class UpdateModel
    {
        public ApplicationUser UserDetails { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }

更新時,如果我嘗試添加新的 Education object,則會出現並發故障。 但是已經存在的教育 object 可以正確更新。

更新時,如果我嘗試添加新的 Education object,則會出現並發故障。 但是已經存在的教育 object 可以正確更新。

你的意思是在同一個動作中創建和更新?

可以嘗試設置一個if else來判斷數據庫是否已經有用戶,然后創建或者編輯model,

喜歡:

public async Task<IActionResult> CreateOrUpdateProfile(UpdateModel model)
    {
        if (ModelState.IsValid)
        {              
            if (_context.ApplicationUsers.Any(x => x.Id == model.UserDetails.Id)) //judge
            {
                //Create...
            }
            else 
            {
                ApplicationUser user = await _userManager.GetUserAsync(User);           
                //Edit...
            }             
        }
        return Json("/Profile/Index");
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM