C# AutoMapper Include未按预期工作?

C# AutoMapper Include未按预期工作?,c#,automapper,C#,Automapper,我(被迫)使用AutoMapper。我有一个基类SchufaBaseFeature和一个派生类SchufaBaseFeature 为什么Include没有像我期望的那样工作 这就是我使用AutoMapper(映射到数据库)所做的: //TODO include无法正常工作! Mapper.CreateMap() .FormMember(dest=>dest.FEATUREWITHOUTBIRTHDATE,opt=>opt.MapFrom(src=>GetSpecified(enumtool(sr

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

为什么Include没有像我期望的那样工作

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

//TODO include无法正常工作!
Mapper.CreateMap()
.FormMember(dest=>dest.FEATUREWITHOUTBIRTHDATE,opt=>opt.MapFrom(src=>GetSpecified(enumtool(src.FEATUREWITHOUTBIRTHDATE),src.FEATUREWITHOUTBIRTHDATE)))
.FormMember(dest=>dest.OWNFEATURE,opt=>opt.MapFrom(src=>GetSpecified(src.OWNFEATURE,src.ownFeatureSpecified)))
.包括()
;
Mapper.CreateMap()
.ForMember(dest=>dest.DATE,opt=>opt.MapFrom(src=>GetDate(src.DATE)))
.ForMember(dest=>dest.AMOUNT,opt=>opt.MapFrom(src=>src.AMOUNT.AMOUNT))
.FormMember(dest=>dest.AMOUNTCUR,opt=>opt.MapFrom(src=>src.amount.currency))
.ForMember(dest=>dest.numberOfInstallments,opt=>opt.MapFrom(src=>TryParseToInt(src.numberofinstalls)))
.FormMember(dest=>dest.INSTALLMENTTYPE,opt=>opt.MapFrom(src=>src.INSTALLMENTTYPE))
;
它正确地映射了没有生日和OWNFEATURE的Feature,但没有调用Include。当我运行调试器时,不会调用第二个CreateMap


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

您可能需要切换创建地图的顺序。Include有一个…功能,它在其中检查现有映射的配置。如果现有地图还不存在,则需要切换顺序


当然,这在5.0中都是固定的,但是您被卡住了:)

我使用
.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)))
            ;
Mapper.CreateMap()
.FormMember(dest=>dest.featurewithout birthdate,opt=>opt.Ignore())
.FormMember(dest=>dest.OWNFEATURE,opt=>opt.Ignore())
.ForMember(dest=>dest.DATE,opt=>opt.MapFrom(src=>GetDate(src.DATE)))
.ForMember(dest=>dest.numberOfInstallments,opt=>opt.MapFrom(src=>TryParseToInt(src.numberofinstalls)))
.FormMember(dest=>dest.INSTALLMENTTYPE,opt=>opt.MapFrom(src=>src.INSTALLMENTTYPE))
.ForMember(dest=>dest.AMOUNT,opt=>opt.Ignore())
.AfterMap((dto,cfschufafeafeature)=>{Mapper.Map(dto.amount,cfschufafeafeature);})
;
Mapper.CreateMap()
.FormMember(dest=>dest.featurewithout birthdate,opt=>opt.Ignore())
.FormMember(dest=>dest.OWNFEATURE,opt=>opt.Ignore())
;
//include在这个AutoMapper版本中不能像预期的那样工作,这就是为什么我们使用ConstructUsing
Mapper.CreateMap()
.ConstructUsing(功能=>
{
var schufaFeature=作为schufaFeature的特征;
var SchufactextFeature=作为SchufactextFeature的特征;
CFSCHUFAFEATURE结果=新的CFSCHUFAFEATURE();
如果(特征!=null)
地图(特征、结果);
if(schufactextfeature!=null)
Map(schufactextfeature,result);
返回结果;
})
.FormMember(dest=>dest.FEATUREWITHOUTBIRTHDATE,opt=>opt.MapFrom(src=>GetSpecified(enumtool(src.FEATUREWITHOUTBIRTHDATE),src.FEATUREWITHOUTBIRTHDATE)))
.FormMember(dest=>dest.OWNFEATURE,opt=>opt.MapFrom(src=>GetSpecified(EnumToBool(src.OWNFEATURE),src.ownFeatureSpecified)))
;

我无法用Include解决问题。即使是玩弄秩序也会让我得到同样的结果。
 //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))
              ;
  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)))
            ;