Вложенные коллекции автосопоставителя C#

У меня есть простая модель, подобная этой:

public class Order{
   public int Id { get; set; }
   ... ...
   public IList<OrderLine> OrderLines { get; set; }
}

public class OrderLine{
   public int Id { get; set; }
   public Order ParentOrder { get; set; }
   ... ...
}

Что я делаю с Automapper, так это:

    Mapper.CreateMap<Order, OrderDto>();
    Mapper.CreateMap<OrderLine, OrderLineDto>();
    Mapper.AssertConfigurationIsValid();

Он выдает исключение, в котором говорится: «Свойство OrderLineDtos в OrderDto не сопоставлено, добавьте пользовательское сопоставление ...» Поскольку мы используем собственный синтаксис в нашем домене и в нашем DomainDto, как я могу указать, что коллекция OrderLineDtos в OrderDto соответствует OrderLines в заказе?

Спасибо


person Raffaeu    schedule 24.11.2009    source источник
comment
Вы пытались поставить OrderLine CreateMap перед отображением Order?   -  person Lazarus    schedule 24.11.2009
comment
Можете ли вы опубликовать, как выглядит ваш Dto? И пример пользовательского синтаксиса, который вы используете? Нам понадобится это, чтобы предоставить вам пример пользовательского сопоставления.   -  person jamesaharvey    schedule 24.11.2009
comment
Если я заменяю заказ, я получаю другую ошибку... OrderDto в OrderLineDto не отображается... Знаете ли вы, как использовать пользовательское выражение сопоставления?   -  person Raffaeu    schedule 24.11.2009


Ответы (2)


Это работает следующим образом:

    Mapper.CreateMap<Order, OrderDto>()
        .ForMember(dest => dest.OrderLineDtos, opt => opt.MapFrom(src => src.OrderLines));
    Mapper.CreateMap<OrderLine, OrderLineDto>()
        .ForMember(dest => dest.ParentOrderDto, opt => opt.MapFrom(src => src.ParentOrder));
    Mapper.AssertConfigurationIsValid();
person Raffaeu    schedule 24.11.2009
comment
Знаете ли вы, что вы можете редактировать свой исходный пост, независимо от вашей репутации? Всегда полезно хранить любые обновления информации в исходном вопросе. - person Jason D; 01.12.2009

Вложенные коллекции работают, если имена совпадают. В ваших DTO у вас есть имя вашей коллекции как «OrderLineDtos», но в объекте Order это просто «OrderLines». Если вы удалите часть «Dtos» в именах свойств OrderLineDtos и ParentOrderDto, все они должны совпасть.

person Jimmy Bogard    schedule 28.11.2009
comment
Значит ли это, что сопоставление вложенных коллекций различных типов классов в настоящее время не работает? Иногда вложенный объект представляет собой ViewModel и имеет свойства, которые необходимо отображать по-разному. Благодарность! - person Abe; 10.12.2010
comment
Будет ли он использовать тот же конкретный тип ICollection/IList, который определен в TDestination? - person Monstieur; 14.05.2013
comment
@Jimmy Bogard: Часто сам вложенный объект является DTO или ViewModel. - person Kamran; 17.03.2014