【问题标题】:How to configure automapper so that it won't override the properties which are not defined in mapping如何配置自动映射器,使其不会覆盖映射中未定义的属性
【发布时间】:2023-02-15 23:45:41
【问题描述】:

我正在使用自动映射器将一个类属性映射到两个不同的其他类,如下代码所示:

var emp = map.Map<EmployeeAddressDto, Employee>(employeeAddressDto);

上面的映射给了我如下的对象:

Address1 = "some xyz address1"
Address2 = "some xyz address2"
Phone = "0000000000"

然后用EmployeeOtherAddressDto映射输出对象

map.Map<EmployeeOtherAddressDto, Employee>(emp);

上面的映射将我的结果更改为:

Address1 = "some other xyz address1"
Address2 = "some other xyz address2"
Phone = null

但我希望它像下面这样:

Address1 = "some other xyz address1"
Address2 = "some other xyz address2"
Phone = "0000000000"
When the above mapping occurs it makes the phone no null but I want it to remain as it was defined on the previous mapping, although I want to override ```Address1``` and ```Address2``` fields.

这是我的映射:

CreateMap<EmployeeAddressDto, Employee>()
                .ForMember(dest => dest.Address1, options => options.MapFrom(src => src.Address1))
                .ForMember(dest => dest.Address2, options => options.MapFrom(src => src.Address2))
                .ForMember(dest => dest.Phone, options => options.MapFrom(src => src.Phone))
                .ValidateMemberList(MemberList.None)
                .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));


CreateMap<EmployeeOtherAddressDto, Employee>()
                .ForMember(dest => dest.Address1, options => options.MapFrom(src => src.Address1))
                .ForMember(dest => dest.Address2, options => options.MapFrom(src => src.Address2))
                .ValidateMemberList(MemberList.None)
                .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));

我想在我的映射配置文件中执行此操作,因为我在很多地方都在使用它并且不想在不使用映射器的情况下更新手机。

【问题讨论】:

    标签: c# asp.net .net .net-core automapper


    【解决方案1】:

    请尝试使用此方法来配置您的映射。

    映射<>()

     CreateMap<EmployeeOtherAddressDto, Employee>().AfterMap<EmployeeMappingAction>()
                    .ForMember(dest => dest.Address1, options => options.MapFrom(src => src.Address1))
                    .ForMember(dest => dest.Address2, options => options.MapFrom(src => src.Address2))                    
                    .ValidateMemberList(MemberList.None)
    

    您可以在映射后检查您的文件,以检查它是否为空。

    public class EmployeeMappingAction: IMappingAction<EmployeeOtherAddressDto,Employee>
    {
        public void Process(EmployeeOtherAddressDto source, Employee destination, ResolutionContext context)
        {
            if (source.Phone == null)
            {
                destination.Phone = "";
            }
        }
    }
    

    【讨论】:

    • 我不想让 make phone 无效。我希望它保持原样
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多