我遇到过这样的情况:我从 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));
}
}
有一个
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";
}