2014-12-07 66 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; 
    }); 
}