首页 > 解决方案 > DTO 的映射组件也是 DTO

问题描述

这是我保存数据库数据的类:

public partial class PermissionGroup
{
    public int Id { get; set; }
    public string Name { get; set; }
    // other database properties

    public virtual ICollection<GroupActionPermission> GroupActionPermissions { get; set; }
}

这就是我的 dto:

public class PermissionGroupDTO
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<GroupActionPermissionDTO> ActionPermissions { get; set; }
}

public class GroupActionPermissionDTO
{
    public int Id { get; set; }
    public int GroupId { get; set; }
    public int PermissionActionId { get; set; }

    public PermissionGroupDTO Group { get; set; }
}

现在,我正在制作映射:

public IEnumerable<PermissionGroupDTO> GetGroups()
{
    return OnConnect<IEnumerable<PermissionGroupDTO>>(db =>
    {
        return db.PermissionGroups
        .Include(i => i.GroupActionPermissions)
        .ProjectTo<PermissionGroupDTO>()
        .ToList();
    });
}

我正在收集PermissionGroupDTO应该包含的集合GroupActionPermissionDTO,但该集合仍然存在null。我的代码有问题吗?恐怕automapper可以从外键映射集合。

另外,这就是我的自动映射器初始化程序:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<PermissionGroup, PermissionGroupDTO>();
    cfg.CreateMap<GroupActionPermission, GroupActionPermissionDTO>();
});

标签: c#asp.netautomapper

解决方案


我相信这里描述了原因http://docs.automapper.org/en/stable/Queryable-Extensions.html

请注意,要使此功能起作用,必须在 Mapping 中显式处理所有类型转换。

这意味着您应该手动配置映射:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<PermissionGroup, PermissionGroupDTO>()
       .ForMember(dto => dto.ActionPermissions , conf => conf.MapFrom(ol => ol.GroupActionPermissions )));;
    cfg.CreateMap<GroupActionPermission, GroupActionPermissionDTO>();
});

顺便说一句,请注意字段的名称不同:GroupActionPermissionsActionPermissions。这也是automapper不自动映射的原因,然后你应该使用我写的手动配置。


推荐阅读