如何在Automapper中映射嵌套的子对象属性

44

我有现有的地图:

CreateMap<Article, ArticleModel>()
    .ForMember(dest => dest.BaseContentItem, opts => opts.MapFrom(src => src.BaseContentItem))
    .ForMember(dest => dest.BaseContentItem.TopicTag, opts => opts.MapFrom(src => src.BaseContentItem.TopicTag))
    .ForMember(dest => dest.MainImage, opts => opts.MapFrom(src => src.MainImage))
    .ReverseMap();

我收到的错误消息是:

System.ArgumentException:“表达式'dest => dest.BaseContentItem.TopicTag'必须解析为顶级成员,而不是任何子对象的属性。在子类型上使用自定义解析器或AfterMap选项。”

我该如何映射它?


3
你需要使用 ForPath 而不是 ForMember。 - Lucian Bargaoanu
2个回答

83

这应该可行。使用ForPath替换ForMember

CreateMap<Article, ArticleModel>()
    .ForMember(dest => dest.BaseContentItem, opts => opts.MapFrom(src => src.BaseContentItem))
    .ForPath(dest => dest.BaseContentItem.TopicTag, opts => opts.MapFrom(src => src.BaseContentItem.TopicTag))
    .ForMember(dest => dest.MainImage, opts => opts.MapFrom(src => src.MainImage))
    .ReverseMap();

如果 dest.BaseContentItem.TopicTag 是一个列表,我们该如何处理? - Ahsam Aslam
如果我想要一个自定义的IValueConverter用于嵌套映射,那么在ForPath上等价于opt.ConvertUsing是什么?这似乎只适用于ForMember。 - GameSalutes

-2

我已经尝试了forPath,但我也遇到了同样的问题。

在客户端上,我得到了404错误。

namespace EternityEduca.Helpers
{
    public class MappingProfiles : Profile
    {
        public MappingProfiles()
        {
            CreateMap<CourseCategory, CourseCategoryToReturnDto>()
                .ForMember(c => c.CourseObj, o => o.MapFrom(s => s.CourseObj))
                .ForMember(c => c.CategoryTypeObj, o => o.MapFrom(s => s.CategoryTypeObj))
                .ForPath(d => d.CourseObj.Img_Url, o => o.MapFrom(s => s.CourseObj.Img_Url))
                .ReverseMap();
        }
    }
}

类:

public class CourseCategoryToReturnDto
    {
        public int Id { get; set; }
        public Course CourseObj { get; set; }
        public CategoryType CategoryTypeObj { get; set; }
    }

客户:

getCourseCategories(typeId?: number) {
    let params = new HttpParams();
    if (typeId) {
      params = params.append('typeId', typeId.toString());
    }
    //Pipe is a wrapper around any other state X operator that can be used in Rxjs
    return this.http.get<IPaginationCourseCategory>(this.baseUrl + 'courses/coursecategories', { observe: 'response', params })
      .pipe(
        map(response => {
          //response body will be Pagination
          return response.body;
        })
      );
  }
}

HTML

<img class="card-img-top" src="{{courseCategory.courseObj.img_Url}}" style="height: 225px; width: 100%; display: block;" data-holder-rendered="true">

1
这不像是一个答案。 - LarsTech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接