Entity framework core 实体框架核心-加载也包含相关实体的相关实体的问题

Entity framework core 实体框架核心-加载也包含相关实体的相关实体的问题,entity-framework-core,Entity Framework Core,我在Chris Sakell的博客后面使用实体框架核心 他使用泛型来管理他的存储库,还使用一个用于所有其他存储库的基础存储库 基本存储库的一部分包含以下代码,用于检索单个实体,该实体还使用includeproperty选项下载相关实体。下面是检索单个项目的通用代码 public T GetSingle(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[]

我在Chris Sakell的博客后面使用实体框架核心

他使用泛型来管理他的存储库,还使用一个用于所有其他存储库的基础存储库

基本存储库的一部分包含以下代码,用于检索单个实体,该实体还使用
includeproperty
选项下载相关实体。下面是检索单个项目的通用代码

public T GetSingle(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includeProperties)
{
    IQueryable<T> query = _context.Set<T>();

    foreach (var includeProperty in includeProperties)
    {
        query = query.Include(includeProperty);
    }

    return query.Where(predicate).FirstOrDefault();
}
该行:

.GetSingle(c => c.Id == id, c => c.Creator, c => c.Jobs, c => c.State);
已成功检索创建者状态和作业的值

但是,对于与“作业”关联的相关实体,不会检索任何内容

尤其是,
jobvisions
是对作业的访问的集合

为了完整起见,我在下面添加了“job”和“jobvisit”实体

public class Job : IEntityBase
{
    public int Id { get; set; }

    public int? ClientId { get; set; }
    public Client Client { get; set; }

    public int? JobVisitId { get; set; }
    public ICollection<JobVisit> JobVisits { get; set; }

    public int? JobTypeId { get; set; }
    public JobType JobType { get; set; }

    public int? WarrantyStatusId { get; set; }
    public WarrantyStatus WarrantyStatus { get; set; }

    public int? StatusId { get; set; }
    public Status Status { get; set; }

    public int? BrandId { get; set; }
    public Brand Brand { get; set; }

    public int CreatorId { get; set; }
    public User Creator { get; set; }

    ....
}

public class JobVisit : IEntityBase
{
    ...
    public int? JobId { get; set; }
    public Job Job { get; set; }

    public int? JobVisitTypeId { get; set; }
    public JobVisitType VisitType { get; set; }
}
公共类作业:IEntityBase
{
公共int Id{get;set;}
公共int?ClientId{get;set;}
公共客户端{get;set;}
public int?JobVisitId{get;set;}
公共ICollection作业访问{get;set;}
public int?作业类型ID{get;set;}
public JobType JobType{get;set;}
公共int?担保状态ID{get;set;}
公共担保状态担保状态{get;set;}
public int?StatusId{get;set;}
公共状态状态{get;set;}
公共int?BrandId{get;set;}
公共品牌品牌{get;set;}
public int CreatorId{get;set;}
公共用户创建者{get;set;}
....
}
公共类工作访问:IEntityBase
{
...
public int?JobId{get;set;}
公共作业作业{get;set;}
public int?作业访问类型ID{get;set;}
公共作业访问类型访问类型{get;set;}
}

我的问题是,,如何修改上面的存储库代码和我的
GetSingle
使用,以便我也可以加载相关的enities
JobVisit
集合和其他相关的单个实体
Brand
JobType

目的是不必为相关的用户检索导航属性与“工作”有关。这就是为什么有些属性是空的。默认情况下,
.Include(属性)只深入一级,这是一件好事。它阻止查询获取数据库的所有数据

如果要包含多个级别,应在
之后使用
。然后使用include(property)
。include(property)
。从:

我的建议是,您的方法
public T GetSingle(…)
很好,我不会为了包含更深层次的内容而更改它。相反,您可以简单地使用显式加载。从:

public class Job : IEntityBase
{
    public int Id { get; set; }

    public int? ClientId { get; set; }
    public Client Client { get; set; }

    public int? JobVisitId { get; set; }
    public ICollection<JobVisit> JobVisits { get; set; }

    public int? JobTypeId { get; set; }
    public JobType JobType { get; set; }

    public int? WarrantyStatusId { get; set; }
    public WarrantyStatus WarrantyStatus { get; set; }

    public int? StatusId { get; set; }
    public Status Status { get; set; }

    public int? BrandId { get; set; }
    public Brand Brand { get; set; }

    public int CreatorId { get; set; }
    public User Creator { get; set; }

    ....
}

public class JobVisit : IEntityBase
{
    ...
    public int? JobId { get; set; }
    public Job Job { get; set; }

    public int? JobVisitTypeId { get; set; }
    public JobVisitType VisitType { get; set; }
}
using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList();
}
using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);

    context.Entry(blog)
        .Collection(b => b.Posts)
        .Load();

    context.Entry(blog)
        .Reference(b => b.Owner)
        .Load();
}