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