Automapper (c #): вложенные отображения не работают, кто-нибудь может помочь? - PullRequest
3 голосов
/ 24 марта 2011

У меня есть простое отображение, и оно работает, но не заполняет Output.Details.

Я немного запутался, думаю, возможно, потому что я использую источник в качестве «Задачи» для каждого.

  Mapper.CreateMap<Task, Output>();


  Mapper.CreateMap<Task, Output.Details>().ForMember(
       dest => dest.Item, opt => opt.MapFrom(src => src.Name));

Насколько я знаю, мне нужно создать 2 карты, 1 для объекта и 1 для объекта, содержащегося в нем.

Проблема в том, что источником для OUTPUT и OUTPUT.DETAILS является TASK

Я попытался углубиться в детали в пределах первой карты и указать Mapfrom, но это дает следующую ошибку, поэтому я должен создать 2 карты

         must resolve to top-level member. Parameter name: lambdaExpression error

  IList<Task> tempItems= GetItems();

        IList<Output> items =
            Mapper.Map<IList<Task>, IList<Output>>(tempItems);

Карта работает, но моя собственность "Предмет" доступна в Output.Details NULL

Что я делаю не так ... вот мой объект назначения. Любая помощь очень ценится

Это имя заполняется без проблем, но внутри DETAILS ничего нет ... они остаются NULL

Задача - не мой класс, но я проверил ее, и все значения должны быть скопированы, следовательно, Tag имеет значение и является STRING.

public class Output   
{
    public string Name { get; set; }

    public Details Summary { get; private set; }

    public class Details
    {
        public string Item{ get; set; }
    }

    public Output()
    {
        Summary = new Details();
    }
}

EDIT

Вот пример класса Task.

enter image description here

EDIT

Здесь приведен пример проекта против 2010 года, и он показывает именно проблему.

http://dl.dropbox.com/u/20103903/AutomapperNotWorking.zip

и вот изображение, показывающее проблему, поскольку вы можете видеть, что Сводный элемент имеет значение "NULL", но он должен содержать ИМЯ из Задачи.

enter image description here

1 Ответ

4 голосов
/ 26 марта 2011

Прежде всего, всегда используйте Mapper.AssertConfigurationIsValid();, чтобы убедиться, что ваша конфигурация сопоставления действительна. Я добавил его в ваш код, и это сразу же выявило проблему: вы не указали Automapper, что делать со свойством Summary. Поскольку Task не содержит свойства Summary, Automapper необходимо знать, что с ним делать.

Так что проблема не в том, как отобразить вложенный класс, вам просто нужно указать Automapper, что делать с Summary. Вот конфигурация Automapper, которая работает для вашего примера:

Mapper.CreateMap<Task, Output>()
    .ForMember(d => d.Summary, o => o.MapFrom(t => new Output.Details {Item = t.Name}));
Mapper.AssertConfigurationIsValid();

Это все, что тебе нужно.

...