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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:57:09