Automapper 将 DTO 扁平化为 Parent with Child Collection

Automapper flattened DTO to Parent with Child Collection

我有一个扁平化的 DTO,我需要将其映射到父子关系。我想通过 AutoMapper 执行此操作,因为我在其他地方使用它并且效果很好。我见过映射父子关系的示例,但当子对象是一个集合并且源是扁平化的 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; }
}

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

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

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

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

Error mapping types.

Mapping types: ParentChildDTO -> Parent

Type Map configuration: ParentChildDTO -> Parent

Property: Children

鉴于您将根据您的评论使用它 - 下面的配置应该可以完成工作(默认情况下父属性已解析 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
                        }
                    }
                });
        });

这是另一个选项,您可以在其中为子项定义自定义映射 属性。

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