2013-12-19 21 views
0

鑑於未來的DTO:Automapper:保留收藏沒有他們的映射

public class OrderDTO{ 
    public int IdOrder{ get; set; } 
    public int TotalPrice { get; set; } 
    public IEnumerable<ProductDTO> Products { get; set; } 
} 

public class ProductDTO{ 
    public int IdProduct { get; set; } 
    public int Description { get; set; } 
} 

的問題是我想的訂單映射到OrderDTO,但有時候,我不需要取產品

當我需要的一切,我做了下:

AutoMapper.Mapper.CreateMap<Order, OrderDTO>().ForMember(
    dest => dest.Products, 
    opt => opt.MapFrom(
     // Custom Map the Product with ProductDTO 
     order => order.Products.Where(n => n.Active).Select(
      aProduct => new ProductDTO{ 
       IdProduct = aProduct.IdProduct, 
       Description = aProduct.Description 
      } 
     ) 
    ) 
); 

它工作的偉大,但問題是,當我不需要產品,接下來我要做的:

AutoMapper.Mapper.CreateMap<Order, OrderDTO>() 

但它返回一個錯誤:

Missing map from Product to ProductDTO. Create using Mapper.CreateMap.

所以,我怎樣才能避免做創建一個Mapper的集合我不需要?? (我不想從我不需要的數據庫中檢索數據)。

回答

0

我建議你創建另一個DTO,命名爲喜歡OrderWithoutProductsDTOBasicOrderDTO,不會對我們的產品

public class OrderWithoutProductsDTO 
{ 
    public int IdOrder{ get; set; } 
    public int TotalPrice { get; set; }  
} 

,讓你跳過打,以實體產品(並因此延遲加載它們)和它也不會混淆人們,誰會使用你的OrderWithoutProductsDTO - 沒有人會問爲什麼有空的產品清單。映射將簡單的樣子:

Mapper.CreateMap<Order, OrderWithoutProductsDTO>(); 

還有一個提示 - 如果你將定義產品和產品DTO映射,那麼你就需要手動將它們映射:

Mapper.CreateMap<Product, ProductDTO>(); 
Mapper.CreateMap<Order, OrderDTO>() 
     .ForMember(dest => dest.Products, 
       opt => opt.MapFrom(o => 
        Mapper.Map<List<ProductDTO>>(o.Products.Where(n => n.Active))); 
+0

謝謝,但它不是一個解決方案,因爲我會有很多DTO的,因爲這是一個例子,但我有一個DTO 8 DTO的子集,所以計算我應該有的總的可能組合。 –

+1

雖然最後的提示非常有用!謝謝 –

+0

@ArielScherman,爲什麼你想加載所有可能的組合?例如。如果您將訂單與客戶,產品收集,折扣收集,意見收集和帳單地址。爲什麼你想要OrderWithCustomerButWithoutProductsAndDiscounts? –

0

可以忽略屬性。

AutoMapper.Mapper.CreateMap<Order, OrderDTO>() 
    .ForMember(dest => dest.Products, opt => opt.Ignore()) 

編輯: 我認爲你正在嘗試做的,由於性能方面的原因,但是請注意不要這麼做。首先,不要經常創建映射器,因爲它是CPU密集型的,而且在高負載下,您將輕鬆獲得100%的CPU。其次,我非常肯定,automapper有一個內部緩存,給定一個具有相同信息的對象,它不會影響映射器,它會返回一個緩存對象。此外,它已緩存映射器,你只是摧毀它。

說,如果這是你真正想要做的,請考慮其他選項。像@Sergey Berezovskiy建議的另一個DTO一樣。

+1

但在這種情況下,OP會有相反的問題 - 映射與產品將無法工作 –

+0

謝謝,但我想避免忽略每個集合我不需要!沒有任何方法可以將每個集合的忽略選項設置爲默認值? –

+1

我剛剛編輯了我的答案,我真的建議你閱讀它。請嘗試向我們解釋你爲什麼試圖做到這一點?避免微觀優化。 –