2011-03-30 227 views
0
public class Order 
{ 
    public int OrderId { get; set; } 
    public string OrderCode { get; set; } 
    public IList<OrderItem> OrderItems { get; set; } 
} 

public class OrderDTO 
{ 
    public string OrderId { get; set; } 
    public string IdentifiableCode { get; set; } 
    public decimal TotalCost { get; set; } 
    public ICollection OrderItems { get; set; } 
} 

public class OrderItem 
{ 
    public int OrderItemId { get; set; } 
    public int ItemCount { get; set; } 
    public Order Order { get; set; } 
} 

public class OrderItemDTO 
{ 
    public int OrderItemId { get; set; } 
    public int ItemCount { get; set; } 
    public OrderDTO Order { get; set; } 
} 

在這種情況下,如何將ILIist的OrderItems映射到ICollection。我嘗試使用解析器,但以遞歸結束,因爲OrderItem具有Order引用。通過AutoMapper將IList映射到ICollection

任何想法?

回答

4

首先,我爲你的課程添加了一些調整。一個是添加構造函數來初始化集合,以便在測試中添加它們。其次,我不明白你爲什麼希望OrderDTO.OrderItems是一個鬆散類型的ICollection。如果你這樣做,Automapper只是將IList分配給ICollection(因爲IList實現了ICollection)。如果將其定義爲IList,Automapper將會看到它知道如何從OrderItem轉換爲OrderItemDTO,並將映射集合中的每個成員。

因爲OrderItemDTO不包含IdentifiableCode和TotalCost(不知道你想要做什麼),所以我還必須添加一些Ignore()。最後,可以通過AfterMap()中的一個簡單的foreach循環完成父/子映射(OrderItemDTO對其父代的引用)。因此,這裏是我想出了映射:

Mapper.CreateMap<Order, OrderDTO>() 
    .ForMember(d => d.IdentifiableCode, o => o.Ignore()) 
    .ForMember(d => d.TotalCost, o => o.Ignore()) 
    .AfterMap((s, d) => 
       { 
        foreach (var l in d.OrderItems) 
        { 
         l.Order = d; 
        } 
       }); 
Mapper.CreateMap<OrderItem, OrderItemDTO>(); 
Mapper.AssertConfigurationIsValid(); 

這裏是我用來檢查的事情了測試:

var order = new Order 
       { 
        OrderCode = "AAA", 
        OrderId = 22, 
        OrderItems = new List<OrderItem>(), 
       }; 
order.OrderItems.Add(new OrderItem { ItemCount = 2, Order = order, OrderItemId = 33 }); 
order.OrderItems.Add(new OrderItem { ItemCount = 1, Order = order, OrderItemId = 99 }); 

var mapped = Mapper.Map<Order, OrderDTO>(order); 
+0

你爲什麼需要實施aftermap與foreach循環。它不是自動映射的嗎?你能爲我這樣的初學者更好地啓發這個嗎? – batmaci 2016-11-30 12:53:49