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