AutoMapper Include无法按预期工作?

时间:2016-08-02 12:12:14

标签: c# automapper

我(我被迫)使用AutoMapper version 1.1.0.188 。我有一个基类 SchufaBaseFeature 和一个派生类 SchufaFeature

public partial class SchufaFeature : SchufaBaseFeature
{//some code here}

为什么Include不能像我期望的那样工作?

这是我用AutoMapper(映射到数据库)所做的:

 //TODO include does not work as it should!
        Mapper.CreateMap<SchufaBaseFeature, CFSCHUFAFEATURE>()
              .ForMember(dest => dest.FEATUREWITHOUTBIRTHDATE, opt => opt.MapFrom(src => GetSpecified(EnumToBool(src.featureWithoutBirthdate), src.featureWithoutBirthdateSpecified)))
              .ForMember(dest => dest.OWNFEATURE, opt => opt.MapFrom(src => GetSpecified(src.ownFeature, src.ownFeatureSpecified)))
              .Include<SchufaFeature, CFSCHUFAFEATURE>()
            ;

 Mapper.CreateMap<SchufaFeature, CFSCHUFAFEATURE>()
                .ForMember(dest => dest.DATE, opt => opt.MapFrom(src => GetDate(src.date)))
                .ForMember(dest => dest.AMOUNT, opt => opt.MapFrom(src => src.amount.amount))
                .ForMember(dest => dest.AMOUNTCUR, opt => opt.MapFrom(src => src.amount.currency))
                .ForMember(dest => dest.NUMBEROFINSTALLEMENTS, opt => opt.MapFrom(src => TryParseToInt(src.numberOfInstallments)))
                .ForMember(dest => dest.INSTALLMENTTYPE, opt => opt.MapFrom(src => src.installmentType))
              ;

正确映射FEATUREWITHOUTBIRTHDATE和OWNFEATURE,但未调用Include。当我运行调试器时,永远不会调用第二个CreateMap。

我已经检查了文档here(AutoMapper Github继承),但我仍然无法理解我做错了什么。可能是什么问题?是我还是这个版本的AutoMapper中有错误?

2 个答案:

答案 0 :(得分:1)

您可能需要切换创建地图的顺序。 Include有一个....功能,可以在其中检查现有地图的配置。如果现有地图还没有,那么您需要切换订单。

当然,这一切都在5.0中得到修复,但你已经卡住了:)

答案 1 :(得分:1)

我使用.ConstructUsing解决了我的问题。在AutoMapper的第一个版本中,Include不能按预期工作,切换顺序对我没有任何作用。以下是我的源代码:

  Mapper.CreateMap<SchufaFeature, CFSCHUFAFEATURE>()
              .ForMember(dest => dest.FEATUREWITHOUTBIRTHDATE, opt => opt.Ignore())
              .ForMember(dest => dest.OWNFEATURE, opt => opt.Ignore())
              .ForMember(dest => dest.DATE, opt => opt.MapFrom(src => GetDate(src.date)))
              .ForMember(dest => dest.NUMBEROFINSTALLEMENTS, opt => opt.MapFrom(src => TryParseToInt(src.numberOfInstallments)))
              .ForMember(dest => dest.INSTALLMENTTYPE, opt => opt.MapFrom(src => src.installmentType))
              .ForMember(dest => dest.AMOUNT, opt => opt.Ignore())
              .AfterMap((dto, cfschufafeature) => { Mapper.Map(dto.amount, cfschufafeature); })
            ;

        Mapper.CreateMap<SchufaTextFeature, CFSCHUFAFEATURE>()
              .ForMember(dest => dest.FEATUREWITHOUTBIRTHDATE, opt => opt.Ignore())
              .ForMember(dest => dest.OWNFEATURE, opt => opt.Ignore())
            ;

        //include does not work in this AutoMapper version as expected, that is why we use ConstructUsing
        Mapper.CreateMap<SchufaBaseFeature, CFSCHUFAFEATURE>()
              .ConstructUsing(feature =>
              {
                  var schufaFeature = feature as SchufaFeature;
                  var schufaTextFeature = feature as SchufaTextFeature;
                  CFSCHUFAFEATURE result = new CFSCHUFAFEATURE();

                  if (schufaFeature != null)
                      Mapper.Map(schufaFeature, result);

                  if (schufaTextFeature != null)
                      Mapper.Map(schufaTextFeature, result);

                  return result;
              })
              .ForMember(dest => dest.FEATUREWITHOUTBIRTHDATE, opt => opt.MapFrom(src => GetSpecified(EnumToBool(src.featureWithoutBirthdate), src.featureWithoutBirthdateSpecified)))
              .ForMember(dest => dest.OWNFEATURE, opt => opt.MapFrom(src => GetSpecified(EnumToBool(src.ownFeature), src.ownFeatureSpecified)))
            ;