DTO的地图组件也属于DTO

时间:2018-07-09 08:51:04

标签: c# asp.net automapper

这是我的类,其中包含数据库数据:

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>();
});

1 个答案:

答案 0 :(得分:0)

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

  

请注意,要使用此功能,必须在“映射”中显式处理所有类型转换。

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

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

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