c# - 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>();
});
解决方案
我相信这里描述了原因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>();
});
顺便说一句,请注意字段的名称不同:GroupActionPermissions与ActionPermissions。这也是automapper不自动映射的原因,然后你应该使用我写的手动配置。
推荐阅读
- javascript - 如何使用 J2V8 将 ByteArray 作为参数传递给函数
- mysql - phpMyAdmin 服务器未显示端口
- excel - 将几个参数传递给 sub
- sql - 查询以列出所有用户并首先对其应用偏移条件,然后是其他过滤器
- sql - 当该字段有多个值时,如何按字段的较低值分组?谷歌 Bigquery 和 SQL
- ios - 如何将数据从应用程序委托传输到另一个类
- vue.js - 使用自定义组件模拟 Vue 插件功能
- r - 在 dplyr 格式中使用 ggplot geom_jitter() 函数调用中的列名
- node.js - Dockerizing 一个 NodeJS 应用程序:package.json 在本地可以正常工作,但不能在容器内工作
- javascript - 试图循环遍历表行数据