使用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
相关产品推荐
相关产品推荐

