自动映射合并/组合映射

时间:2013-01-04 10:06:10

标签: c# automapper-2

我们假设我有这些映射:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

Dtos的继承:

DetailDto : BaseDto

UpdateDto : BaseDto

有没有办法将第一个映射合并/组合到mapping2和mapping3?

这样的事情:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .Import(mapping1);
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .Import(mapping1);
    .ForMember(o => o.Temp, m => m.Ignore());

.Include函数似乎没有做我想要的,因为以下不起作用:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .Include<Order, DetailDto>()
    .Include<Order, UpdateDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

更新:编辑问题更具体

2 个答案:

答案 0 :(得分:0)

我想知道它是不是一个错误。 documentation州:

  

在AutoMapper 2.0中,它变为:

Mapper.CreateMap<Order, OrderDto>()
  .Include<OnlineOrder, OnlineOrderDto>()
  .Include<MailOrder, MailOrderDto>()
  .ForMember(o=>o.Id, m=>m.MapFrom(s=>s.OrderId));
Mapper.CreateMap<OnlineOrder, OnlineOrderDto>();
Mapper.CreateMap<MailOrder, MailOrderDto>();
     

因为我们已经定义了基类的映射,所以我们不再需要在子映射中定义它。

我刚刚升级到AutoMapper 2.2.1-ci9000,我的行为与您相同(即Referrer未被忽略)。

我建议你create an issue,看看他们说了什么。

答案 1 :(得分:0)

我意识到这有点晚了,但为了其他有类似问题的人的利益......

我遇到了同样的问题,直到我在AutoMapper Github wiki上找到this page

总结:

根据优先级评估继承的配置(以解决多个映射对同一成员具有冲突配置的问题)。继承的Ignore()的优先级低于AutoMapper的基于标准约定的映射。因此,源和目标类型都具有Referrer属性,大多数派生类型的基于约定的映射会覆盖继承的Ignore()

那表明,在这种情况下,您需要为Ignore()

派生的每种类型的地图重复BastDto
相关问题