AutoMapper:忽略现有更新时的属性,但在创建

时间:2016-06-07 10:14:49

标签: c# automapper

是否可以以这样的方式配置/使用AutoMapper:当我创建来自映射的对象时,我允许所有属性和子集合,但是,当执行时更新到现有对象,映射将忽略子集合属性,因为它们将为空,但我不希望它们被删除。

这是因为我正在使用WCF服务,该服务向对象发送增量更改,并且我的大多数模型都在树层次结构中工作:

Parent
  List<Child> Children

ParentDto
  List<ChildDto> Children

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

这很好用,第一次填充子集合。但是,在某些情况下,我将仅使用父POCO属性更改(例如日期时间更改)发送ParentDto,但子列表将为空,因为它们都没有更改。通常我会这样做:

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

但显然会改变整个树并使用空子列表填充本地对象。大规模简化,但会像

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

可能吗?

我还应该添加我使用SimpleInjector DI框架。那么也许有一种方法来注册2个配置,一个配置忽略,一个配置没有?

2 个答案:

答案 0 :(得分:1)

Use .ForMember(dest => dest.A, opt => opt.MapFrom(src => src.B)) for mapping only properties you need to update.

答案 1 :(得分:0)

对于那些仍然很难找到这个的人。您可以使用Autommapper Conditional Mapping

你可以在初始化

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

这将忽略基于源对象中的属性的映射。要映射您需要使用的现有目标 Mapper.Map(source, destination)方法而不是var result = Mapper.Map<ChildDto>(source)属性。