AutoMapper:当从2个不同的源成员映射到同一个目标成员时,第二个源成员不映射

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

我正在尝试将包含多种类型的 SourceCar 模型映射到 DestinationCar,但在尝试从 2 个不同的源映射到同一对象时,我遇到了困难。模型 DestinationDriverInfo 应该在映射结果中保存它的两个属性的值,但它只保存 NumberOfYearsDriving 的值而不是 NumberOfClaims。

下面的模型和映射配置:

image

执行:

预期结果:

属于 DestinationDriverInfo 的属性都应该被填充。 (NumberOfYearsDriving & NumberOfClaims)

实际结果:

只有 DestinationDriverInfo 中的 NumberOfYearsDriving 属性是从源映射的。

附言: 无法更改源模型。

这里是一个可执行的例子: https://gist.github.com/ReeceDigital/1944cfea50900de9feb83df8112e1266

谢谢!

c# automapper .net-6.0
1个回答
0
投票

这是您的配置:

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());
});
© www.soinside.com 2019 - 2024. All rights reserved.