Отображение глубокого уровня с использованием Automapper

Я пытаюсь сопоставить объекты с многоуровневыми членами: это классы:

 public class Father
    {
        public int Id { get; set; }
        public Son Son { get; set; }
    }

    public class FatherModel
    {
        public int Id { get; set; }
        public int SonId { get; set; }
    }

    public class Son
    {
        public  int Id { get; set; }
    }

Вот как я пытаюсь это сделать:

 AutoMapper.Mapper.CreateMap<FatherModel , Father>()
                      .ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId));

это исключение, которое я получаю:

Выражение 'dest => Convert (dest.Son.Id)' должно разрешаться в член верхнего уровня, а не в какие-либо свойства дочернего объекта. Вместо этого используйте настраиваемый преобразователь для дочернего типа или параметр AfterMap. Имя параметра: lambdaExpression

Спасибо


person SexyMF    schedule 21.03.2013    source источник


Ответы (3)


Это будет работать как для сопоставления с новым, так и с существующим объектом.

Mapper.CreateMap<FatherModel, Father>()
    .ForMember(x => x.Son, opt => opt.MapFrom(model => model));
Mapper.CreateMap<FatherModel, Son>()
    .ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId));
person Allrameest    schedule 21.03.2013
comment
Важной частью этого ответа является сопоставление свойства Son с моделью, что заставляет использовать второе сопоставление (строка 2). - person Steve; 26.01.2015

    AutoMapper.Mapper.CreateMap<FatherModel, Father>()
                     .ForMember(x => x.Son, opt => opt.ResolveUsing(model => new Son() {Id = model.SonId}));

если он становится более сложным, вы можете написать класс ValueResolver, см. пример здесь - http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers

person Maxim    schedule 21.03.2013

Используйте ForPath, а не ForMember, и это работает как по волшебству.

person Teja Swaroop    schedule 25.01.2019
comment
Ответы, предполагающие .MapFrom(), не помогли мне, но это сработало. - person derekbaker783; 17.11.2020