我想将 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!);
}
}
谢谢你帮助我
更改您的 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!);
}
}