问题
The GetAll and Get methods of the ready-made CrudAppService don't include child entities.
Is it possible to modify its behaviour?
Update
GetAllIncluding has some problem if the included entity has a navigation property to the parent; it falls into a sort of circular dependency. Is there any Attribute or trick to exclude the navigation property from the serialization? The [NonSerialized] attribute does not seem to be applicable to a navigation property.
PostAppService:
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);
}
}
PostDto:
[AutoMap(typeof(Post))]
public class PostDto : EntityDto
{
public ICollection<Item> Items { get; set; }
}
Post entity:
[Table("AbpPosts")]
public class Post : FullAuditedEntity<int,User>
{
public virtual ICollection<Item> Items { get; set; }
}
Item entity:
[Table("AbpItems")]
public class Item : Entity
{
[ForeignKey("PostId")]
public Post Post { get; set; }
public int PostId { get; set; }
}
回答1:
You have to use eager-loading.
Override CreateFilteredQuery and GetEntityById in your AppService:
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;
}
}
The benefit of overriding these methods is that you continue to get permission checking, counting, sorting, paging and mapping for free.
Update
GetAllIncludinghas some problem if the included entity has a navigation property to the parent; it falls into a sort of circular dependency. Is there anyAttributeor trick to exclude the navigation property from the serialization?
Return ItemDto (without navigation property) in PostDto.
回答2:
Yes, You have to include explicitly like this.
GetAll().Include(i => i.ChildEntities)
回答3:
You have to include the child entities manually. It's lazy loading by design.
来源:https://stackoverflow.com/questions/48403273/retrieve-child-entities-from-crudappservice-in-abp