2016-08-09 2 views
0

У меня следующее отображение:AutoMapper условное отображение Guid вызывает исключение

Mapper.Initialize(cfg => cfg.CreateMap<StructureDTO, Structure>() 
    .ForMember(dest => dest.ParentId, 
    opt => opt.MapFrom(src => src.ParentStructureId != Guid.Empty ? src.ParentStructureId : (Guid?)null))) 

dest.ParentId is nullable Guid 
src.ParentStructureId is Guid 


я получаю следующее исключение:

Исключение типа 'System.InvalidOperationException' произошло в System.Core.dll, но не был обработан в пользовательском коде

Дополнительная информация: Операнды оператора 'NotEqual' не соответствуют параметрам метода 'op_Inequality'.

Это потому, что я пытаюсь сопоставить два разных типа? Я здесь в недоумении.

Automapper версия 5.0.2

+0

Возможно, это ошибка AutoMapper, можете ли вы открыть проблему GitHub? Также этот вопрос похож на тот, который зафиксирован в 5.1.1. –

+0

@JimmyBogard Конечно, хочу, чтобы я попытался обновить, прежде чем открывать проблему? – JB06

+0

Да, это будет мой первый вопрос по проблеме GH :) –

ответ

1

сделать метод, который делает работу для вас, а затем использовать метод в ForMember метода:

private Guid? Transform(StructureDTO src) { 
    return src.ParentStructureId != Guid.Empty ? src.ParentStructureId : (Guid?) null; 
} 

затем сделать ваше отображение так:

Mapper.Initialize(cfg => cfg.CreateMap<StructureDTO, Structure>() 
    .ForMember(dest => dest.ParentId, 
     opt => opt.MapFrom(src => Transform(src)))); 

Это ошибка логики построения выражений AutoMapper, она пытается конвертировать вашу лямбду в .NET expression tree, чтобы обойти это, поэтому мы должны сделать это MethodCallExpression. Это вызывает ваш новый метод напрямую, не преобразовывая его в выражения.

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