Automapper将DTO扁平化为具有子集合的父级

时间:2018-03-26 18:38:25

标签: c# .net automapper automapper-6

我有一个扁平的DTO,我需要将其映射到Parent with Children关系。我想通过AutoMapper这样做,因为我在其他地方使用它并且效果很好。我已经看到了映射父和子的示例,但是当Child是一个集合而源是一个展平的DTO时却没有。我已经创建了一些可用于正确配置的类。以下是我的示例课程:

public class Parent
{
    public int ParentId { get; set; }
    public string ParentName { get; set; }

    public List<Child> Children { get; set; }
}
public class Child
{
    public int ChildId { get; set; }
    public string ChildName { get; set; }
}
public class ParentChildDTO
{
    public int ParentId { get; set; }
    public string ParentName { get; set; }
    public int ChildId { get; set; }
    public string ChildName { get; set; }
}

我正在启动时执行映射器初始化。在我尝试执行映射之前,我没有收到任何错误。下面是我的mapper初始化代码。我一直留在注释掉的线上,以显示我试图完成此任务的另一种方式:

AutoMapper.Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<ParentChildDTO, Child>();
                cfg.CreateMap<ParentChildDTO, Parent>()
                    .ForMember(dest => dest.Children, opt => opt.MapFrom(src => src));
                    //.ForMember(dest => dest.Children, opt => opt.MapFrom(src => new Child { ChildId = src.ChildId, ChildName = src.ChildName }));               

            });

以下是我用于尝试执行映射配置的代码:

ParentChildDTO parentChildDTO = new ParentChildDTO { ParentId = 1, ParentName = "Parent Name", ChildId = 2, ChildName = "Child Name" };
Parent parent = AutoMapper.Mapper.Map<ParentChildDTO, Parent>(parentChildDTO);

List<LienActivity> mapTest = AutoMapper.Mapper.Map<List<BaseActivityUploadDTO>, List<LienActivity>>(request.Activities);

我考虑使用自定义值解析器,但希望避免复杂性和额外代码,如果我正在做的事情是正确的配置。

以上是我在上面的代码中遇到的错误:

  

映射类型时出错。

     

映射类型:ParentChildDTO - &gt;家长

     

类型地图配置:ParentChildDTO - &gt;家长

     

财产:儿童

2 个答案:

答案 0 :(得分:2)

这是另一个选项,您只需为Children属性定义自定义映射。

Mapper.Initialize(cfg =>
{
   cfg.CreateMap<ParentChildDTO, Parent>()
      .ForMember(d => d.Children, 
         opt => opt.MapFrom(src => new List<Child>() { new Child() { ChildId = src.ChildId, ChildName = src.ChildName } }));
});

答案 1 :(得分:0)

根据你的评论给出你将要使用的内容 - 以下配置应该完成这项工作(默认情况下解析父属性AutoMapper约定,因此无需显式映射):

        AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<ParentChildDTO, Parent>()
                .ConstructUsing(item => new Parent
                {
                    Children = new List<Child>
                    {
                        new Child
                        {
                            ChildId = item.ChildId,
                            ChildName = item.ChildName
                        }
                    }
                });
        });