AutoMapper中Profile与[AutoMap]/[SourceMember]配置冲突问题求助
AutoMapper配置冲突:[SourceMember]特性与Profile忽略空值规则无法同时生效
业务场景
将Salesforce PubSub CDC API解码得到的Avro消息DTO映射至Entity类,DTO因Salesforce自定义字段后缀规则,属性命名较为特殊。使用[SourceMember]特性标记目标类属性以指定映射源,同时通过AutoMapper Profile配置所有成员忽略空值源字段(CDC事件中DTO多数属性通常为null)。
问题现象
同时使用Profile(配置Condition)和目标类上的[AutoMap]特性时,二者无法同时生效:
- 注释掉
c.AddProfile(new AutoMapperProfile()):[SourceMember]特性生效,但Profile的忽略空值规则不生效,会出现DTO的null覆盖Entity已有有效值的情况 - 注释掉
c.AddMaps(typeof(TargetEntityClass)):Profile的忽略空值规则生效,但[SourceMember]特性不生效,特殊命名的字段无法正确映射
环境信息
- .NET 7
- EF Core 7.0.9
- AutoMapper及扩展 12.0.1
- Visual Studio for Mac v17.6.1
相关代码示例
配置代码
var autoMapperConfig = new MapperConfiguration(c => { c.AddProfile(new AutoMapperProfile()); c.AddMaps(typeof(TargetEntityClass)); }); IMapper mapper = autoMapperConfig.CreateMapper(); services.AddSingleton(mapper);
Profile代码
public class AutoMapperProfile : Profile { public AutoMapperProfile() { CreateMap<SourceDtoClass, TargetEntityClass>() .ForAllMembers(option => option.Condition((src, dst, srcMember) => srcMember != null)); } }
SourceDtoClass
public class SourceDtoClass { public string? Name { get; set; } = ""; public string? Phone_number_1__c { get; set; } = ""; }
TargetEntityClass
[DataContract] [Serializable] [AutoMap(typeof(SourceDtoClass))] public class TargetEntityClass { public string Name { get; set; } = ""; [DataMember] [SourceMember("Phone_number_1__c")] public string? Phone { get; set; } = ""; }
使用方式
// 假设已通过IoC注入mapper,sourceDtoClass已实例化,targetEntityClass是从EF SQL查询得到的完整实体实例 mapper.Map(sourceDtoClass, targetEntityClass);
内容的提问来源于stack exchange,提问作者BSmith
相关产品推荐
相关产品推荐

