簡體   English   中英

如何使用自動映射器 map 在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM