2016-08-02 3 views
1

나는 (강제로) AutoMapper를 사용합니다. version 1.1.0.188. 나는 기본 클래스 SchufaBaseFeature 및 파생 클래스 SchufaFeature입니다.AutoMapper Include가 예상대로 작동하지 않습니까?

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

내가 예상 한대로 포함이 작동하지 않는 이유는 무엇입니까?

이 내가 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하지만,이 호출되지 않습니다 포함합니다. 디버거를 실행하면 두 번째 CreateMap이 호출되지 않습니다.

here (AutoMapper Github Inheritance) 문서를 확인했지만 내가 잘못하고있는 것을 여전히 이해할 수 없습니다. 무엇이 문제일까요? 나 또는이 버전의 AutoMapper에 버그가 있습니까?

답변

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))) 
      ; 
1

지도를 만드는 순서를 전환해야 할 수도 있습니다. Include에는 구성을 위해 기존 맵을 검사하는 기능이 있습니다. 기존지도가 아직없는 경우 순서를 전환해야합니다.

이 모든 과정의 5.0에 고정되어 있지만 :) 붙어있어

+0

포함하여 ... – Devid

+0

나는 문제를 해결할 수 없습니다. 주문을 가지고 노는 것조차도 항상 똑같은 결과를 얻습니다. – Devid

관련 문제