【问题标题】:Mapping a model into a dto and 'include' only the key of child element将模型映射到 dto 并仅“包含”子元素的键
【发布时间】:2012-08-22 06:44:57
【问题描述】:

我有以下项目模型:

public class Project
{
    [Key]
    public int      ProjectID       { get; set; }
    public string   Name            { get; set; }
    public string   Description     { get; set; }     
    public virtual  ICollection<Screenshot> Screenshots { get; set; }   
}

我有以下截图模型:

public class Screenshot
{
    [Key]
    public int    ScreenshotID { get; set; }
    public string ScreenshotName { get; set; }
    public byte[] ScreenshotContent { get; set; }
    public string ScreenshotContentType { get; set; }
}

如您所见,每个项目都附有一些屏幕截图。在下面的函数中,我想检索一些项目,只检索对应截图的ID。

public SearchResultDTO<ProjectDTO> GetProjects(SearchParametersProjectDTO dto)
{
    ...
    var resultDTO = new SearchResultDTO<ProjectDTO>
    {
        Entities = Mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDTO>>(projects.ToList()),
        TotalItems = projects.Count()
    };
    return resultDTO;
}

这是 ProjectDTO:

[DataContract]
public class ProjectDTO : BaseDTO<ProjectDTO, Project>
{
    [DataMember]
    public int ProjectID { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public IEnumerable<int> ScreenshotID { get; set; }

所以我不知道如何在我的 DTO 中映射 ScreenshotID。

非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: asp.net-mvc entity-framework automapper


    【解决方案1】:

    创建Screenshotint 之间的映射:

    Mapper
        .CreateMap<Screenshot, int>()
        .ConvertUsing(s => s.ScreenshotID);
    

    ProjectProjectDTO 之间的映射中使用它:

    Mapper
        .CreateMap<Project, ProjectDTO>()
        .ForMember(
            dest => dest.ScreenshotID,
            opt => opt.MapFrom(src => src.Screenshots)
        );
    

    当你想映射时:

    var project = new Project
    {
        Screenshots = new[]
        {
            new Screenshot { ScreenshotID = 1 },
            new Screenshot { ScreenshotID = 2 },
            new Screenshot { ScreenshotID = 3 },
        }
    };
    
    var projectDto = Mapper.Map<Project, ProjectDTO>(project);
    
    // at this stage the projectDto.ScreenshotID collection will contain 
    // the necessary information
    

    【讨论】:

    • 它可以编译,但在运行时,我收到错误“成员的自定义配置仅支持类型上的顶级个人成员。”在 Screenshot 和 int 之间的 CreateMap 上。任何的想法?无论如何,谢谢。
    • 谢谢,效果很好。现在我在这里搜索一个稍微不同的实现:stackoverflow.com/questions/12070844/… 如果你有时间可以看看吗?无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多