iMapster 在 .NET 中的身份问题

问题描述 投票:0回答:1

我想将 DTO 与身份模型(实体)映射。

但是我收到以下错误

InvalidOperationException:无法跟踪实体类型“IdentityUser”的实例,因为已跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。

我写的代码:

 public static TypeAdapterConfig MapUserToUpdateUserDto()
 {
     var config = new TypeAdapterConfig();
     config.NewConfig<IdentityUser,UpdateUserDto>()
         .Map(e => e.PhoneNumber, d => d.PhoneNumber)
         .Map(e => e.Email, d => d.Email)
         .Map(e => e.UserName, d => d.UserName)
         .Map(e => e.Active, d => d.EmailConfirmed)
         .Map(e => e.Active, d => d.PhoneNumberConfirmed)
         .TwoWays();
     return config;
 }

 public async Task UpdateUser(UpdateUserDto model)
 {
     var user = await _userManager.FindByIdAsync(model.Id!);
     user = model.Adapt<IdentityUser>(UserMapster.MapUserToUpdateUserDto());
     
     var resultUpdateUser= await _userManager.UpdateAsync(user);

     if (resultUpdateUser.Succeeded)
     {
         if (!string.IsNullOrEmpty(model.Password) && !string.IsNullOrEmpty(model.PasswordConfirmed))
         {
             var token = await _userManager.GeneratePasswordResetTokenAsync(user);
             await _userManager.ResetPasswordAsync(user, token, model.Password);
         }

         var roles = await _userManager.GetRolesAsync(user!);

         await _userManager.RemoveFromRolesAsync(user, roles);
         await _userManager.AddToRolesAsync(user, model.Role!);
     }
 }

谢谢你帮助我

asp.net .net asp.net-core asp.net-identity mapster
1个回答
0
投票

更改您的 UpdateUser 方法,如下所示。

将更改调整到

user
,而不是替换它。

 public async Task UpdateUser(UpdateUserDto model)
 {
     var user = await _userManager.FindByIdAsync(model.Id!);
     // Change your code here
     // adapt the changes onto it, not replacing the `user` 
     model.Adapt<IdentityUser>(UserMapster.MapUserToUpdateUserDto());
     
     var resultUpdateUser= await _userManager.UpdateAsync(user);

     if (resultUpdateUser.Succeeded)
     {
         if (!string.IsNullOrEmpty(model.Password) && !string.IsNullOrEmpty(model.PasswordConfirmed))
         {
             var token = await _userManager.GeneratePasswordResetTokenAsync(user);
             await _userManager.ResetPasswordAsync(user, token, model.Password);
         }

         var roles = await _userManager.GetRolesAsync(user!);

         await _userManager.RemoveFromRolesAsync(user, roles);
         await _userManager.AddToRolesAsync(user, model.Role!);
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.