首页 > 解决方案 > 在 EF Core 中,如何解决 Include ThenInclude 链循环引用?

问题描述

考虑以下场景。我有 3 个类,代表学生和主题之间的多对多(N 对 N)关系:

public class Student
{
    public long Id { get; set; }
    public string Name { get; set; }
    public DateTime Birthday { get; set; }
    public long RegistrationNumber { get; set; }

    public virtual ICollection<Grade> Grades { get; set; }
}
public class Grade
{
    public long Id { get; set; }
    public int Value { get; set; }

    public virtual Student Student { get; set; }
    public virtual Subject Subject { get; set; } 
}
public class Subject
{
    public long Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Grade> Grades { get; set; }
}


我想检索每个科目的所有学生的列表以及他们的成绩。为此,我使用:

// context being DbContext
var res = context.Student.Include(s => s.Grades).ThenInclude(g => g.Subject);

由于属性是延迟加载的,我希望每个主题只包含它们的“名称”属性。但是,经过检查,我发现“成绩”列表也设置了,列出了分配给该科目的所有成绩。当然,这会导致对象循环。

我想避免这种循环引用,即获取一个列表,其中每个主题的唯一设置属性是“名称”。我该怎么做?

标签: c#entity-frameworkasp.net-coreef-core-3.0

解决方案


如果您使用 asp.net core 3.0 MVC/Web API,只需按照以下步骤来克服使用NewtonsoftJson.

1.安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包(版本取决于你的项目)

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0

2.在启动时添加以下代码

services.AddControllersWithViews().AddNewtonsoftJson(x =>
        {
            x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

推荐阅读