ASP.NET Core 5 中如何使用 AutoMapper 将传入数据映射后存入数据库
第一步:修正AutoMapper映射配置
你当前只配置了FinLegCheckEntity到FinLegCheckModel的单向映射,而业务中需要把外部接收的模型类映射到实体类,所以需要补全双向映射,同时可以直接在映射规则里统一处理Created、Modified时间的自动赋值,避免业务代码中重复写:
public class FinLegCheckProfile:Profile { public FinLegCheckProfile() { // 原有实体转模型的映射保留 CreateMap<FinLegCheckEntity,FinLegCheckModel>(); // 新增模型转实体的映射 CreateMap<FinLegCheckModel, FinLegCheckEntity>() // 只有新增实体(Id为默认值0)时赋值创建时间,更新操作保留原有创建时间 .ForMember(dest => dest.Created, opt => opt.MapFrom((_, dest) => dest.Id == 0 ? DateTimeOffset.UtcNow : dest.Created)) // 无论新增还是更新,都自动刷新修改时间 .ForMember(dest => dest.Modified, opt => opt.MapFrom(_ => DateTimeOffset.UtcNow)); // 子实体类也要配置双向映射 CreateMap<PlatformKYCLevels, PlatformKYCLevels>().ReverseMap(); } }
第二步:替换手动赋值的业务代码
AutoMapper的Map方法有两个常用重载,刚好对应你的更新、新增两种场景:
- 已有目标对象的更新场景:传入源对象和已存在的目标对象,AutoMapper会自动把源对象的字段值覆盖到目标对象上,不会创建新对象
- 新增场景:直接传入源对象,指定目标实体类型,AutoMapper会创建新的实体对象并填充所有匹配字段
修改后的业务代码如下:
var customerFincheckData = dbContext.FinLegCheckEntities.FirstOrDefault(s => s.CustomerId == fincheckdata.CustomerId); if (customerFincheckData != null) { // 把模型数据映射到已查询到的实体上,自动完成所有字段赋值 _mapper.Map(fincheckdata, customerFincheckData); dbContext.FinLegCheckEntities.Update(customerFincheckData); dbContext.SaveChanges(); return Task.FromResult(true); } else { // 直接把模型转换为新的实体对象 var finlegEntities = _mapper.Map<FinLegCheckEntity>(fincheckdata); dbContext.FinLegCheckEntities.Add(finlegEntities); dbContext.SaveChanges(); return Task.FromResult(true); }
注意事项
如果你的业务要求更新时不直接替换PlatformKycLevels集合,而是基于原有集合做增删改避免主键冲突,可以在映射配置中添加集合映射的相关规则,适配EF Core的变更跟踪逻辑。
内容的提问来源于stack exchange,提问作者moris62
相关产品推荐
相关产品推荐

