我有一个扁平的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;家长
财产:儿童
答案 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
}
}
});
});