Entity framework core 实体框架核心-加载也包含相关实体的相关实体的问题
我在Chris Sakell的博客后面使用实体框架核心 他使用泛型来管理他的存储库,还使用一个用于所有其他存储库的基础存储库 基本存储库的一部分包含以下代码,用于检索单个实体,该实体还使用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>>[]
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
使用,以便我也可以加载相关的enitiesJobVisit
集合和其他相关的单个实体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();
}