You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AutoMapper更新IdentityFramework用户时模型Id异常变更求助

问题分析与解决方案

问题出在你调用AutoMapper的方式上:
你当前使用的mapper.Map<AppUser>(updateUserVM)会创建一个全新的AppUser实例,而不是更新你从数据库查到的user对象。因为你的UpdateUserVM没有Id属性,新实例的Id会被设为默认值(比如空字符串),这就导致后续调用userManager.UpdateAsync(user)时,操作的是一个Id错误的新对象。

你的AutoMapper配置ForAllMembers(a => a.UseDestinationValue())是正确的,但需要搭配正确的Map重载才能生效——这个配置的作用是当源对象(UpdateUserVM)没有对应属性时,保留目标对象(数据库查出来的AppUser)的原有值,但前提是你要把目标对象传入Map方法。

修正后的代码

public async Task<object> UpdateUser(UpdateUserVM updateUserVM, string id)
{
    AppUser user = await userManager.FindByIdAsync(id);
    // 将updateUserVM的属性映射到已有的user对象上,而非创建新对象
    mapper.Map(updateUserVM, user);
    var result = await userManager.UpdateAsync(user);
    string msg = string.Empty;
    if (!result.Succeeded)
    {
        foreach (var error in result.Errors)
        {
            msg += $"{error.Code} - {error.Description}\n";
        }
        return msg;
    }
    return true;
}

补充说明

  • mapper.Map<TSource, TDestination>(source, destination)这个重载会直接修改传入的destination对象,不会返回新对象,这样就能保留user原本的Id以及其他ViewModel中没有的属性值。
  • 你的AutoMapper配置ForAllMembers(a => a.UseDestinationValue())确保了所有ViewModel未定义的属性(比如Id、SecurityStamp等Identity框架的内置属性)都会保留数据库中查到的原始值,不会被覆盖。

内容的提问来源于stack exchange,提问作者Arda Şen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:36:52