2013-01-04 158 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