Во-первых, я добавил несколько настроек в ваши классы. Одним из них было добавить конструкторы, которые инициализируют коллекции, чтобы я мог добавить их в свой тест. Во-вторых, я не понимаю, почему вы хотите, чтобы OrderDTO.OrderItems был свободно типизированной коллекцией ICollection. Если вы сделаете это, Automapper просто назначит IList для ICollection (поскольку IList реализует ICollection). Если вы определите его как IList, Automapper увидит, что он знает, как преобразовать OrderItem в OrderItemDTO, и сопоставит каждого члена коллекции.
Мне также пришлось добавить некоторые Ignore (), поскольку OrderItemDTO не содержит ни IdentifiableCode, ни TotalCost (не уверен, что вы хотели с ними сделать). Наконец, отображение родителя / потомка (OrderItemDTO, имеющее ссылку на своего родителя) может быть выполнено простым циклом foreach в AfterMap (). Итак, вот карта, которую я придумал:
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);