如何防止我的Include()语句填充包含的实体的集合?

时间:2018-12-31 04:45:52

标签: c# entity-framework

我正在使用EF Core 2.1,数据库优先方法。在获取目标实体集合时,我尝试包含一个外键实体,但是正在发生一些奇怪的事情。

实体结构为Job-> JobStatus。我正在获取一些Job实体,并希望包括Job的JobStatus外键属性。 问题在于JobStatus实体具有一个ICollection [Job]属性,该属性正在填充数据库中的每个作业。这导致有效负载的大小为千兆字节。

当我在Job上包含JobStatus时,我想满足以下解决方案之一。我也愿意考虑其他我从未想到的解决方案或解决方法。 *如何防止JobStatus的ICollection属性填充? *或者我是否可以阻止实体框架首先生成该属性?

我已经探索了忽略ReferenceLoopHandling

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

2 个答案:

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