[英]Automapper - how to map two complex collections to one destination collection object
[英]How to map a collection inside a object with automapper
我不知道如何將我的 dto 中的 map 'Poses' 放入我的 controller。
我的 DTO 看起來像這樣
public class NewInstructorProgramDto
{
public ICollection<int> Poses { get; set; }
}
我有一個 object 看起來像下面這樣我需要 map 我的 DTO 到這個
public class InstructorProgram : BaseEntity
{
public ICollection<InstructorProgramPose> Poses { get; set; }
}
InstructorProgramPose 看起來像這樣
public class InstructorProgramPose : BaseEntity
{
public int PoseId { get; set; }
public Pose Pose { get; set; }
public int InstructorProgramId { get; set; }
public InstructorProgram InstructorProgram { get; set; }
}
在我的 controller 我 map 是這樣的
var newInstructorProgram = _mapper.Map<NewInstructorProgramDto, InstructorProgram>(newInstructorProgramDto);
在我的映射文件中,我需要弄清楚如何將 Pose 的所有整數 map 轉換為“InstructorProgramPose”對象的集合,其中 integer 是 PoseId
這是我到目前為止所擁有的,但這不起作用,因為它只映射一個 InstructorProgramPose,而不是一個集合
CreateMap<NewInstructorProgramDto, InstructorProgram>()
.ForMember(d => d.Poses, o => o.MapFrom(s => new InstructorProgramPose() { PoseId = s.}));
我認為我在下面的代碼中走在了正確的軌道上
CreateMap<NewInstructorProgramDto, InstructorProgram>()
.ForMember(d => d.Poses, o => o.MapFrom(s => s.Poses));
CreateMap<ICollection<int>, ICollection<InstructorProgramPose>>()
.ForMember(d => d.Select(i => i.PoseId), o => o.MapFrom(s => s.Select(i => i)));
但是調試器拋出一個錯誤說
發生異常:CLR/AutoMapper.AutoMapperConfigurationException AutoMapper.dll 中發生類型“AutoMapper.AutoMapperConfigurationException”的異常,但未在用戶代碼中處理:“成員的自定義配置僅支持類型上的頂級單個成員。”
更新- 只是為了讓您了解我在 Automapper 中嘗試做的事情,我已經包含了我用來創建和填充 object 而不使用 Automapper 的代碼,只是為了展示需要什么。
在我的 controller
var newInstructorProgram = new InstructorProgram() {
Name = newInstructorProgramDto.Name,
Description = newInstructorProgramDto.Description,
Length = (EventLength)newInstructorProgramDto.Length,
Experience = (Experience)newInstructorProgramDto.Experience,
Style = (YogaStyle)newInstructorProgramDto.Style,
Calories = newInstructorProgramDto.Calories,
InstructorId = userFromRepo.Id
};
foreach(var poseId in newInstructorProgramDto.Poses) {
var newPose = new InstructorProgramPose() { PoseId = poseId };
newInstructorProgram.Poses.Add(newPose);
}
_unitOfWork.Repository<InstructorProgram>().Add(newInstructorProgram);
我昨晚實施了一個解決方案,所以我把它貼在這里。 我在下面顯示的映射中添加了一個擴展方法
CreateMap<InstructorProgramForUpdateDto, InstructorProgram>()
.ForMember(d => d.Poses, opt => opt.MapFrom(s => s.Poses.GetInstructorProgramPoses<InstructorProgramPose>()));
這是擴展程序中的方法 class
public static ICollection<T> GetInstructorProgramPoses<T>(this ICollection<int> poses) where T : IInstructorProgramPose, new() {
var instructorProgramPoseColllection = new List<T>();
foreach(var poseId in poses) {
T pose = new T();
pose.PoseId = poseId;
instructorProgramPoseColllection.Add(pose);
}
return instructorProgramPoseColllection;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.