我正在使用EF Core 2.1,数据库优先方法。在获取目标实体集合时,我尝试包含一个外键实体,但是正在发生一些奇怪的事情。
实体结构为Job-> JobStatus。我正在获取一些Job实体,并希望包括Job的JobStatus外键属性。 问题在于JobStatus实体具有一个ICollection [Job]属性,该属性正在填充数据库中的每个作业。这导致有效负载的大小为千兆字节。
当我在Job上包含JobStatus时,我想满足以下解决方案之一。我也愿意考虑其他我从未想到的解决方案或解决方法。 *如何防止JobStatus的ICollection属性填充? *或者我是否可以阻止实体框架首先生成该属性?
services.AddMvc().AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
public partial class Job
{
public long Id { get; set; }
public long StatusId { get; set; }
public JobStatus Status { get; set; }
}
public partial class JobStatus
{
public JobStatus()
{
Job = new HashSet<Job>();
}
public long Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public ICollection<Job> Job { get; set; }
}
var jobs = _context.Set<Job>()
.Where(job => job.Id == 1)
.Include(job => job.Status);
答案 0 :(得分:1)
添加“虚拟”关键字。除非您另外进行特殊标记,否则任何虚拟ICollection都会被延迟加载。
super
答案 1 :(得分:1)
一种避免填充Job集合的方法是通过定义或匿名类型显式选择要返回的列:
var jobs = _context.Set<Job>()
.Where(job => job.Id == 1)
.Include(job => job.Status)
.Select(job => new
{
Id = job.Id,
StatusName = job.Status.Name
});