我正在尝试将包含多种类型的 SourceCar 模型映射到 DestinationCar,但在尝试从 2 个不同的源映射到同一对象时,我遇到了困难。模型 DestinationDriverInfo 应该在映射结果中保存它的两个属性的值,但它只保存 NumberOfYearsDriving 的值而不是 NumberOfClaims。
执行:
预期结果:
属于 DestinationDriverInfo 的属性都应该被填充。 (NumberOfYearsDriving & NumberOfClaims)
实际结果:
只有 DestinationDriverInfo 中的 NumberOfYearsDriving 属性是从源映射的。
附言: 无法更改源模型。
这里是一个可执行的例子: https://gist.github.com/ReeceDigital/1944cfea50900de9feb83df8112e1266
谢谢!
这是您的配置:
var config = new MapperConfiguration(c =>
{
c.CreateMap<SourceCar, DestinationCar>()
.ForMember(dest => dest.Driver, opt => opt.MapFrom(src => src.Info));
c.CreateMap<SourceInfo, DestinationDriver>()
.ForMember(dest => dest.DriverInfo, opt => opt.MapFrom(src => src.GeneralInfo));
c.CreateMap<SourceGeneralInfo, DestinationDriverInfo>()
.ForMember(dest => dest.NumberOfClaims, opt => opt.MapFrom(src => src.Claim.NumClaims))
.ForMember(dest => dest.NumberOfYearsDriving, opt => opt.MapFrom(src => src.Driver.NumDriving));
});
所以你可以将
SourceInfo
与嵌套对象及其属性直接映射到 DestinationDriver
属性,它将与当前结构一起工作。
如果您不需要能够在没有父对象的情况下直接将对象从
SourceClaim
转换为 DestinationDriverInfo
或从 SourceDriver
到 DestinationDriverInfo
,这就足够了。否则你也可以将这些映射添加到配置中:
var config = new MapperConfiguration(c =>
{
c.CreateMap<SourceCar, DestinationCar>()
.ForMember(dest => dest.Driver, opt => opt.MapFrom(src => src.Info));
c.CreateMap<SourceInfo, DestinationDriver>()
.ForMember(dest => dest.DriverInfo, opt => opt.MapFrom(src => src.GeneralInfo));
c.CreateMap<SourceGeneralInfo, DestinationDriverInfo>()
.ForMember(dest => dest.NumberOfClaims, opt => opt.MapFrom(src => src.Claim.NumClaims))
.ForMember(dest => dest.NumberOfYearsDriving, opt => opt.MapFrom(src => src.Driver.NumDriving));
c.CreateMap<SourceDriver, DestinationDriverInfo>()
.ForMember(dest => dest.NumberOfYearsDriving, opt => opt.MapFrom(src => src.NumDriving))
.ForMember(dest => dest.NumberOfClaims, opt => opt.Ignore());
c.CreateMap<SourceClaim, DestinationDriverInfo>()
.ForMember(dest => dest.NumberOfClaims, opt => opt.MapFrom(src => src.NumClaims))
.ForMember(dest => dest.NumberOfYearsDriving, opt => opt.Ignore());
});