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

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);

疑问

  1. 为什么手动替换集合引用的AfterMap代码能解决问题?
  2. 上述替代实现是否是正确的做法?
  3. 如何在更新前对对象进行校验?

内容的提问来源于stack exchange,提问作者Avshalom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:02:04