现成的GetAll
的{{1}}和Get
方法不包含子实体。
是否可以修改其行为?
CrudAppService
会出现问题;它属于一种循环依赖。是否有GetAllIncluding
或技巧从序列化中排除导航属性? Attribute
属性似乎不适用于导航属性。
PostAppService :
[NonSerialized]
PostDto :
public class PostAppService : CrudAppService<Post, PostDto>, IPostAppService
{
IRepository<Post> _repository = null;
public PostAppService(IRepository<Post> repository) : base(repository)
{
_repository = repository;
}
protected override IQueryable<Post> CreateFilteredQuery(PagedAndSortedResultRequestDto input)
{
return _repository.GetAllIncluding(p => p.Items);
}
}
发布实体:
[AutoMap(typeof(Post))]
public class PostDto : EntityDto
{
public ICollection<Item> Items { get; set; }
}
项目实体:
[Table("AbpPosts")]
public class Post : FullAuditedEntity<int,User>
{
public virtual ICollection<Item> Items { get; set; }
}
答案 0 :(得分:5)
你必须使用预先加载。
覆盖AppService中的CreateFilteredQuery
和GetEntityById
:
public class MyAppService : CrudAppService<ParentEntity, ParentEntityDto>, IMyAppService
{
public MyAppService(IRepository<ParentEntity> repository)
: base(repository)
{
}
protected override IQueryable<ParentEntity> CreateFilteredQuery(PagedAndSortedResultRequestDto input)
{
return Repository.GetAllIncluding(p => p.ChildEntity);
}
protected override ParentEntity GetEntityById(int id)
{
var entity = Repository.GetAllIncluding(p => p.ChildEntity).FirstOrDefault(p => p.Id == id);
if (entity == null)
{
throw new EntityNotFoundException(typeof(ParentEntity), id);
}
return entity;
}
}
覆盖这些方法的好处是,您可以免费获得permission checking,counting,sorting,paging和mapping。
如果包含的实体具有父级的导航属性,则
GetAllIncluding
会出现问题;它属于一种循环依赖。是否有Attribute
或技巧从序列化中排除导航属性?
在ItemDto
中返回PostDto
(没有导航属性)。
答案 1 :(得分:2)
是的,您必须明确包含这样的内容。
GetAll().Include(i => i.ChildEntities)
答案 2 :(得分:1)
您必须手动包含子实体。它是设计上的延迟加载。
答案 3 :(得分:0)
与谁一起使用 AsyncCrudAppService 的人,您有两个不同的孩子列表:
下面通过子列表获取特定的父对象
protected override Task<Parent> GetEntityByIdAsync(int id)
{
var entity = Repository.GetAllIncluding(p => p.listOfFirstChild).Include(x => x.listOfSecondChild).FirstOrDefault(p => p.Id == id);
return base.GetEntityByIdAsync(id);
}
答案 4 :(得分:0)
在Abp.io中,您所需要的(必须添加到从 CrudAppService 继承的PostService中):
protected override IQueryable<Post> CreateFilteredQuery(PagedAndSortedResultRequestDto input)
{
return _postReposiory
.Include(p => p.Item);
}