c# - 在 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);
由于属性是延迟加载的,我希望每个主题只包含它们的“名称”属性。但是,经过检查,我发现“成绩”列表也设置了,列出了分配给该科目的所有成绩。当然,这会导致对象循环。
我想避免这种循环引用,即获取一个列表,其中每个主题的唯一设置属性是“名称”。我该怎么做?
解决方案
如果您使用 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;
});
推荐阅读
- javascript - Chrome 扩展:将变量(url)发送到 python
- wordpress - 导入后wordpress用户配置文件url问题
- ios - 呼叫 Btn 给出错误的号码
- html - Angular 反应式表单验证
- javascript - 如何使用扩展获取 Azure Notebook 的用户详细信息?
- zsh - 通过 cmder 或 conemu 在 wsl 上运行 zsh 时,光标键在 vim 中不起作用
- android - 升级到 Android Studio 3.2.1 后出现构建错误
- android - Android WiFi-Direct 组队
- c++ - 跨所有类型的矢量化范围随机数生成
- java - Java 嵌入式 HttpServer:套接字泄漏