在ABP中从CrudAppService检索子实体 [英] Retrieve child entities from CrudAppService in ABP
问题描述
现成的CrudAppService
的GetAll
和Get
方法不包含子实体.
The GetAll
and Get
methods of the ready-made CrudAppService
don't include child entities.
是否可以修改其行为?
GetAllIncluding
会出现问题.它属于一种循环依赖关系.是否有任何Attribute
或技巧可以将导航属性排除在序列化之外? [NonSerialized]
属性似乎不适用于导航属性.
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; }
}
发布实体:
[Table("AbpPosts")]
public class Post : FullAuditedEntity<int,User>
{
public virtual ICollection<Item> Items { get; set; }
}
项目实体:
[Table("AbpItems")]
public class Item : Entity
{
[ForeignKey("PostId")]
public Post Post { get; set; }
public int PostId { get; set; }
}
推荐答案
您必须使用eager-loading.
You have to use eager-loading.
在您的AppService中覆盖CreateFilteredQuery
和GetEntityById
:
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.
如果包含的实体具有到父级的导航属性,则
GetAllIncluding
会出现问题.它属于一种循环依赖关系.是否有任何Attribute
或技巧可以将导航属性从序列化中排除?
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 anyAttribute
or trick to exclude the navigation property from the serialization?
在PostDto
中返回ItemDto
(无导航属性).
Return ItemDto
(without navigation property) in PostDto
.
这篇关于在ABP中从CrudAppService检索子实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!