ABP 4.4下AutoMapper的Ignore方法从Dto映射Entity时忽略Id字段不生效
问题原因
- ABP 4.4的AutoMapper集成模块内置了实体Id映射约定:从DTO映射到实体时,默认会优先将DTO的Id属性赋值给实体的Id,优先级高于用户自定义的Ignore规则。
- 你的Country实体存在接收Id参数的构造函数,AutoMapper默认会优先匹配构造函数参数完成实例化,此时就算配置了Id的Ignore规则,构造函数执行时已经完成了Id赋值,规则不会生效。
解决方案
你可以根据自己的业务场景选择任意一种方案处理:
- 方案1:强制指定映射时使用无参构造函数,禁用构造函数参数匹配
CreateMap<CountryDto, Country>() .ConstructUsing((dto, context) => new Country()) // 强制走无参构造 .Ignore(x => x.Id);
- 方案2:全局开启ABP的DTO到实体映射忽略Id的配置,在你模块的
ConfigureServices方法中添加如下配置:
Configure<AbpAutoMapperOptions>(options => { // 全局配置所有DTO映射到实体时默认忽略Id字段 options.MapFromDtoToEntityIgnoreId = true; });
配置后你不需要再单独给每个实体映射配置Id的Ignore规则,框架会自动处理;如果有特殊场景需要赋值Id,单独给对应映射添加ForMember(x=>x.Id, opt=>opt.MapFrom(src=>src.Id))覆盖全局规则即可。
- 方案3:兜底处理,使用AfterMap强制清空Id值,不受前面映射逻辑影响:
CreateMap<CountryDto, Country>() .Ignore(x => x.Id) .AfterMap((dto, entity) => entity.Id = null);
内容的提问来源于stack exchange,提问作者Kes
相关产品推荐
相关产品推荐

