2014-12-07 76 views
1
public class OrderDTO 
{ 
    public string ClientName { get; set; } 
    public ICollection<OrderDetailDTO> Details { get; set; } 
} 

public class Order 
{ 
    public string ClientName { get; set; } 
    public ICollection<OrderDetail> Details { get; set; } 
} 

public class OrderDetailDTO 
{ 
    public int Quantity { get; set; } 
    public string ProductName { get; set; } 
} 

public class OrderDetail 
{ 
    public int OrderId { get; set; } 
    public int Quantity { get; set; } 
    public string ProductName { get; set; } 
} 

比方說,有4 OrderDetailDTO,我想有自動遞增的整數值映射OrderDetail實例。我現在正在做的是後處理映射的實例。AutoMapper具有自動遞增值

var mappedOrder = Mapper.Map<OrderDTO, Order>(orderDto); 
var orderId = 1; 
foreach (OrderDetail detail in mappedOrder.Details) 
{ 
    detail.OrderId = orderId++; 
} 

如何我可以配置映射選項,以使得映射ICollection<OrderDetail>包含4個OrderDetail實例與OrderId爲1,2,3,4?

+0

請問爲什麼? OrderId是否指向現有的'Order's?如果沒有,這是沒用的。 – 2014-12-07 12:21:47

+0

代碼片段僅僅是一個例子。在我的項目中,我沒有使用這些模型。 – 2014-12-07 13:03:59

回答

3

您可以配置AutoMapper與AfterMap做到這一點:

Mapper.CreateMap<OrderDTO, Order>() 
    .AfterMap((src, dest) => 
    { 
     int orderId = 1; 
     foreach (OrderDetail detail in dest.Details) 
     { 
      detail.OrderId = orderId++; 
     } 
    }); 

我不認爲有一個真正的「乾淨」的方式使用AutoMapper做到這一點。

1

我使用下面的方法更簡單,可以寫成基類或擴展方法。這裏的例子使用泛型,但可以很容易地轉換

protected virtual IEnumerable<T> ConvertCsvLines(IEnumerable<TV> lines) 
{ 
    var lineNumber = 0; 

    return lines.Select(x => 
    { 
     var retVal = Mapper.Map<TV, T>(x); 
     retVal.LineNumber = lineNumber++; 
     return retVal; 
    }); 
}