从ABP

时间:2018-01-23 13:45:51

标签: c# asp.net-core parent-child entity-framework-core aspnetboilerplate

现成的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; }
}

5 个答案:

答案 0 :(得分:5)

你必须使用预先加载。

覆盖AppService中的CreateFilteredQueryGetEntityById

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 checkingcountingsortingpagingmapping

更新

  如果包含的实体具有父级的导航属性,则

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);
        }