AutoMapper - 如何为两个不同的用例设置单个映射?

问题描述 投票:0回答:1

我遇到过这样的情况:我从 API 获取一些有关行程的数据。我正在使用 AutoMapper 将此“API 模型”映射到 EF Core 实体,以便存储在我的 SQL Server 数据库中。

大多数映射都很简单,但我正在努力解决一种情况:

TripModel
有一个名为
ReasonForTravel
的属性,它是一个
int?
值 - 如果它有一个值,并且该值是
> 0
,然后我想使用自定义
ValueConverter
int
转换为我需要的字符串 - 但如果
ReasonForTravel
根本没有值,或者它是
<= 0
,那么我想改为取该值从
CustomTravelReason
TripModel

如何在 AutoMapper

CreateMap
中表达这一点,以便我可以一步将我的
TripModel
映射到
Trip
实体?

这是我的代码 - 模型、实体和 AutoMapper

Profile
:

public class TripModel
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public int? ReasonForTravel { get; set; }
    public string CustomTravelReason { get; set; }
    // more stuff, but irrelevant here
}

public class Trip
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string ReasonForTrip { get; set; }
}

public class TripProfile : Profile
{
    public TripProfile()
    {
        CreateMap<TripModel, Trip>
            // I know these two aren't strictly necessary - just for illustration of what I'm doing
            .ForMember(dest => dest.Firstname, opt => opt.MapFrom(src => src.Firstname))
            .ForMember(dest => dest.Lastname, opt => opt.MapFrom(src => src.Lastname))
            
            // but how do I specify this now?? This is for the case of ReasonForTravel > 0
            .ForMember(dest => dest.ReasonForTrip, opt => opt.ConvertUsing(new TravelReasonConverter(), src => src.Lastname))

            // and this is for the case of ReasonForTravel <= 0 or ReasonForTravel = null
            .ForMember(dest => dest.ReasonForTrip, opt => opt.MapFrom(src => src.CustomTravelReason));
    }
}
c# mapping automapper
1个回答
0
投票

有一个

MapFrom
重载,允许传递
Func
,您可以在其中指定 if/else 检查。不幸的是,它不能与
ConvertUsing
结合使用,但您可以自己调用该转换器。

或者,您可以选择使用常规函数来进行转换,而不是使用转换器。

CreateMap<TripModel, Trip>()
    // Other mappings
    // ...
    .ForMember(dest => dest.ReasonForTrip,
        opt => opt.MapFrom((src, dest, member, resolutionContext) =>
            src.ReasonForTravel > 0 
                ? new TravelReasonConverter().Convert(src.ReasonForTravel, resolutionContext) 
                : src.CustomTravelReason
        ));
        
public class TravelReasonConverter : IValueConverter<int?, string>
{
    public string Convert(int? sourceMember, ResolutionContext context)
        => "some converted value";    
}
© www.soinside.com 2019 - 2024. All rights reserved.