2

我有一个扁平的 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);

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

这是我使用上述代码得到的错误:

错误映射类型。

映射类型:ParentChildDTO -> Parent

类型映射配置:ParentChildDTO -> Parent

属性:儿童

4

2 回答 2

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 } }));
});
于 2018-03-26T20:16:01.800 回答
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
                        }
                    }
                });
        });
于 2018-03-26T20:11:00.417 回答