2016-08-02 2 views
1

I (я вынужден использовать) AutoMapper version 1.1.0.188. У меня есть базовый класс SchufaBaseFeature и производный класс SchufaFeature.AutoMapper Include не работает должным образом?

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

Почему это не работает, как я ожидал?

Это то, что я сделал с AutoMapper (Mapping в БД):

//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

я не мог решить эту проблему с Include. Даже игра с орденом всегда дает мне тот же результат. – Devid

Смежные вопросы