具有自动递增值的AutoMapper

时间:2014-12-07 11:01:36

标签: asp.net entity-framework automapper

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实例具有自动递增的整数值。我现在正在做的是对映射实例进行后处理。

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?

2 个答案:

答案 0 :(得分:5)

您可以将AutoMapper配置为使用AfterMap执行此操作:

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

我不认为使用AutoMapper真的有一种“更干净”的方法。

答案 1 :(得分: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;
    });
}