Картографирование глубоких уровней с использованием 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

Спасибо

Ответ 1

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

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));

Ответ 2

    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

Ответ 3

дублировать: fooobar.com/questions/159347/...

Mapper.CreateMap<DomainClass, Child>();
Mapper.CreateMap<DomainClass, Parent>()
  .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id))
  .ForMember(d => d.A, opt => opt.MapFrom(s => s.A))
  .ForMember(d => d.Child, 
             opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s)));

Благодаря: @justin-niessner

Ответ 4

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