2016-06-07 4 views
1

Можно ли настроить/использовать AutoMapper таким образом, чтобы когда i создал объект из сопоставления, я разрешаю все свойства и дочерние коллекции, однако, когда это приходит к выполнению обновления существующему объекту, отображение будет игнорировать свойства дочерних элементов, поскольку они будут пустыми, но я не хочу, чтобы они были удалены.AutoMapper: игнорировать свойство при обновлении существующего, но разрешить при создании

Это потому, что я работаю со службой WCF, которая отправляет изменения дельты на объекты и большая часть моей модели работает в иерархии дерева:

Parent 
    List<Child> Children 

ParentDto 
    List<ChildDto> Children 

config.CreateMap<ParentDto, Parent>(); 
config.CreateMap<ChildDto, ChildDto>(); 

Это хорошо работает и сбор ребенка заполняется первый раз вокруг , Тем не менее, есть сценарии, в которых я буду отправлять ParentDto через только изменения свойств родительского POCO (например, изменение даты и времени), но список дочерних элементов будет пустым, поскольку ни один из них не изменился. Обычно я хотел бы сделать:

_Mapper.Map<ParentDto,Parent>(dto, local) 

, но очевидно, что изменит все дерево и заполнить локальный объект с пустым списком детей. Массовое упрощение, но что-то вроде

_Mapper.Map<ParentDto, Parent>(dto, local).Ignore(p => p.Children) 

возможно?

Я также должен добавить, что я использую каркас SimpleInjector DI. Так что, возможно, есть способ зарегистрировать 2 конфигурации, один с игнорированием и один без?

ответ

1

Используйте .ForMember(dest => dest.A, opt => opt.MapFrom(src => src.B)) для сопоставления только тех свойств, которые вам необходимо обновить.

+0

thanks; как бы я использовал это в описанном выше сценарии? Мне нужно полное дерево при создании исходного объекта, но игнорируйте дочерние коллекции при обновлении существующего. – percentum

0

Для тех, кто все еще пытается найти это. Вы можете использовать Autommapper Conditional Mapping.

Вы можете сделать это, как это, в Initialize

config.CreateMap<ChildDto, ChildDto>().ForMember(dest => dest.Children, opt => opt.Condition(source => source.TriggerChildMap)); 

Это отображение проигнорирует основано на свойстве в исходном объекте. Для сопоставления с существующим пунктом назначения вам необходимо использовать метод Mapper.Map(source, destination), а не var result = Mapper.Map<ChildDto>(source).

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