AutoMapper映射时列表元素的Guid字段被置为默认值如何解决
问题产生原因
- AutoMapper的默认集合映射逻辑为替换集合元素,而非就地更新已有元素。你配置的全局「源成员为null时不执行映射」规则仅作用于属性级映射:当传入的
FirstDto的SecondEntities属性不为null时,AutoMapper不会复用你从数据库查询到的原有SecondEntity实例,而是为列表内的每个元素新建SecondEntity实例。 - 由于
SecondDto本身不包含CreatorId、LastModifierId字段,新建的SecondEntity实例的这两个字段没有被赋值,自然会被初始化为Guid类型的默认值(全0)。 - 根级的
CreatorId、LastModifierId可以保留原值,是因为FirstDto没有对应字段,触发了你配置的空源成员不映射规则,不会覆盖目标实例的已有值。
解决方案
方案1:显式配置集合映射采用匹配Id的就地更新逻辑,复用已有实体实例
你可以在FirstDto到FirstEntity的映射配置中增加AfterMap逻辑,手动匹配Id对应的已有SecondEntity实例进行更新,避免创建新实例:CreateMap<FirstDto, FirstEntity>() .AfterMap((dto, entity, mapperContext) => { foreach (var secondDto in dto.SecondEntities) { // 匹配Id一致的已有实体 var existingSecond = entity.SecondEntities.FirstOrDefault(s => s.Id == secondDto.Id); if (existingSecond != null) { // 复用已有实例执行映射,不会覆盖未配置的字段 mapperContext.Mapper.Map(secondDto, existingSecond); } // 若需要支持新增子元素,可在这里补充添加逻辑 } });方案2:配置集合相等比较器+忽略审计字段,适配AutoMapper自动集合映射
你可以直接配置SecondDto到SecondEntity的映射规则,指定Id匹配逻辑,同时显式忽略审计字段的映射:// 配置子实体映射规则 CreateMap<SecondDto, SecondEntity>() // 指定Id作为元素匹配依据,AutoMapper会自动复用匹配的已有实例 .EqualityComparison((dto, entity) => dto.Id == entity.Id) // 显式忽略审计字段,避免被覆盖 .ForMember(dest => dest.CreatorId, opt => opt.Ignore()) .ForMember(dest => dest.LastModifierId, opt => opt.Ignore());
内容的提问来源于stack exchange,提问作者Kubra
相关产品推荐
相关产品推荐

