【问题标题】:Using AutoMapper how do I use a parent property in a child collection?使用 AutoMapper 如何在子集合中使用父属性?
【发布时间】:2020-03-31 17:58:06
【问题描述】:

使用 AutoMapper 如何在子集合中使用父属性?

我想映射这个类:

public class ParentModel
{

    public int Id { get; set; }

    public string Test { get; set; }

    public ICollection<ChildModel> Children { get; set; }

}

到这个班级:

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

    public string Test { get; set; }

    public ICollection<ChildDTO> Children { get; set; }

}

并具有以下映射:

    CreateMap<ParentModel, ParentDTO>()
            .ForMember(d => d.Children , opt => opt.MapFrom(s => s.Children))

    ;

    CreateMap<ChildModel, ChildDTO>()
    ;   

ChildDTO 类有一个名为 Test 的属性,其值需要来自名为 Test

的 ParentModel 类属性
public class ChildDTO
{

    public int Id { get; set; }

    public string Name { get; set; }

    //Take Me From The Parent Class
    public string Test { get; set; }

}

我应该在映射中指定什么来实现这一点?

我想在代码中使用的是

var dto = Maper.Map<ParentDTO>(parentModel);

并且让该 DTO 包含子 DTO,其中包含从父级映射的 Test 字段。

【问题讨论】:

标签: c# automapper


【解决方案1】:

全部排序。

最后走下自定义值解析器路线。

public class MyCustomResolver : IValueResolver<ParentModel, ParentDTO, ICollection<ChildDTO>>
{
    public ICollection<ChildDTO> Resolve(ParentModel source, ParentDTO destination, ICollection<ChildDTO> destMember, ResolutionContext context)
    {
        return source.Children.Select(s => new ChildDTO
        {

            Id = s.Id,
            Name = s.Name,
            Test = source.Test


        }).ToList();

    }
}       


CreateMap<ParentModel, ParentDTO>()
       .ForMember(dest => dest.Children, opt => opt.ResolveUsing<MyCustomResolver>());
;

【讨论】:

  • @LucianBargaoanu 这种方法有问题吗?我从您的评论中看到您提到了键值映射。我对这种方法的理解是将值传递到映射中。您不会让它们从父类继承。如果我错了,请随时提供建议实施的答案。仅供参考 - 我在描述的末尾添加了更多内容。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多