2013-01-04 203 views
2

假设我有这些映射:Automapper合并/合并映射

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()); 

的DTO的继承:

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

得出每种类型为什么你就不能这样做的:var mapping1 = Mapper.CreateMap <订单,OrderDto >() .ForMember(o => o.Referrer,m => m.Ignore())。ForMember(o => o.Price,m => m.Ignore());? – Icarus

+0

@伊卡洛斯它有点复杂,因为映射有不同的目的地。我更新了这个问题。 – Dennis

回答

0

我不知道它是否有bug。该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它,看看他们说什么。

0

我意识到这来得有点晚,但别人有类似问题的好处...

我同样的问题挣扎,直到我发现this page在AutoMapper Github的维基。

总结:

继承的配置对优先级进行评估(以解决问题,其中多个地图有相同的成员冲突的配置)。继承的Ignore()比AutoMapper的标准基于约定的映射具有更低的优先级。因此,在源和目标类型都具有Referrer属性的情况下,大多数派生类型的基于约定的映射覆盖继承的Ignore()

这表明,那么,在这种情况下,你需要重复Ignore()的地图从BastDto