DotNet EF 7结合AutoMapper时List<string>变更未同步至数据库的问题
AutoMapper映射List后EF Core未更新数据库字段
场景说明
我从SQL Express数据库查询Business对象,使用AutoMapper将UpdateBusinessDto的属性映射到该对象,再保存回数据库。但遇到了集合属性更新不生效的问题。
类定义
源类(UpdateBusinessDto)
public int Id { get; set; } public string Name { get; set; } = string.Empty; public List<string> Roles { get; set; } = new List<string>();
目标类(Business)
public int Id { get; set; } public string Name { get; set; } = string.Empty; public User? User { get; set; } public List<string> Roles { get; set; } = new List<string>(); public List<Employee> Employees { get; set; } = new List<Employee>();
初始实现代码
var business = await context.Businesses .Include(b => b.User) .FirstOrDefaultAsync(b => b.Id == newBusiness.Id); if (business == null) { // 空值处理逻辑 } mapper.Map(newBusiness, business); await context.SaveChangesAsync(); response.Data = mapper.Map<GetBusinessDto>(business);
问题现象
Name属性能正常更新到数据库Roles(List<string>类型)在本地business对象中已正确映射,但数据库里的该字段没有更新- 请求响应示例:
// 发送的请求 { "id": 3, "name": "Testing", "roles": ["NewRole"] } // 收到的响应 { "data": { "id": 3, "name": "Testing", "roles": ["NewRole"], // 其他字段省略 } } // 再次查询的结果 { "data": { "id": 3, "name": "Testing", "roles": ["Bartender"], // 还是旧值 // 其他字段省略 } }
临时解决方案
在AutoMapper配置中添加AfterMap手动赋值集合引用后,问题解决:
CreateMap<UpdateBusinessDto, Business>() .AfterMap((src, dest) => dest.Roles = src.Roles); // 关键代码
替代实现(也生效,但不确定正确性)
放弃查询现有对象,直接映射生成新对象后调用Update:
// 注释掉原来的查询和映射逻辑 //var business = await context.Businesses // .Include(b => b.User) // .FirstOrDefaultAsync(b => b.Id == newBusiness.Id); //if (...) // NULL CHECK //{ // ... //} //mapper.Map(newBusiness, business); var updated = mapper.Map<Business>(newBusiness); context.Businesses.Update(updated); await context.SaveChangesAsync(); response.Data = mapper.Map<GetBusinessDto>(updated);
疑问
- 为什么手动替换集合引用的
AfterMap代码能解决问题? - 上述替代实现是否是正确的做法?
- 如何在更新前对对象进行校验?
内容的提问来源于stack exchange,提问作者Avshalom
相关产品推荐
相关产品推荐

