ABP .NET Core内置CRUD获取父表时子列表为null,如何获取父子表全量数据?
解决ABP .NET Core中CRUD操作子表数据为Null的问题
这个问题很常见——ABP的AsyncCrudAppService默认的GetAll实现只会查询主实体本身,不会自动加载关联的子集合数据,所以你的子表列表才会是null。下面是具体的解决方案:
步骤1:更新DTO并配置AutoMapper映射
首先,你需要在MainProjectDto中添加子表对应的DTO集合属性,同时确保AutoMapper能正确映射主实体和子实体的关系。假设你的子实体是SubProject,对应的DTO是SubProjectDto:
[AutoMap(typeof(MainProject), ReverseMap = true)] public class MainProjectDto : EntityDto<int> { // 这里保留你原有的主表属性 public string ProjectName { get; set; } // 添加子表集合属性 public List<SubProjectDto> SubProjects { get; set; } } // 子表DTO也要配置AutoMap [AutoMap(typeof(SubProject))] public class SubProjectDto : EntityDto<int> { public int MainProjectId { get; set; } public string SubProjectName { get; set; } // 其他子表属性... }
步骤2:重写AppService的查询逻辑,主动加载子表数据
接下来,你需要在MainProjectAppService中重写CreateFilteredQuery方法,通过EF Core的Include方法主动加载子表数据(这叫贪婪加载,避免延迟加载导致的上下文释放问题):
public class MainProjectAppService : AsyncCrudAppService<MainProject, MainProjectDto, int, PagedAndSortedResultRequestDto, MainProjectDto, MainProjectDto> { public MainProjectAppService(IRepository<MainProject, int> repository) : base(repository) { } protected override IQueryable<MainProject> CreateFilteredQuery(PagedAndSortedResultRequestDto input) { // 调用基类的查询逻辑,然后Include子表集合 return base.CreateFilteredQuery(input) .Include(m => m.SubProjects); // 这里的SubProjects是MainProject实体中定义的子集合导航属性 } }
额外注意事项
- 确保你的
MainProject实体中已经正确定义了子集合的导航属性,且标记为virtual(方便EF Core生成代理,不过这里我们用贪婪加载,virtual不是必须,但推荐保留):public class MainProject : Entity<int> { public string ProjectName { get; set; } public virtual ICollection<SubProject> SubProjects { get; set; } = new List<SubProject>(); } - 如果你的子表还有更深层级的关联数据,可以用
ThenInclude继续加载,比如.Include(m => m.SubProjects).ThenInclude(s => s.SubSubProjects)。
这样修改后,调用GetAll方法时就会同时返回主表行和对应的子表数据了。
内容的提问来源于stack exchange,提问作者Abdulaziz Burghal
相关产品推荐
相关产品推荐

