entity-framework - 问题:页面崩溃并消耗大量内存(Blazor + EF 3.1.1)
问题描述
我最近开始使用 Blazor 和 Entity Framework,遇到了一个我不知道如何正确解决的问题:
我对 DB 使用 Blazor 服务器 + webassembly 和代码优先方法。我有 2 个具有一对多关系的实体,并且想要加载包含父对象的子对象。如果我得到一张桌子的所有子对象,一切都很好;但是,如果我通过使用 Where 方法和 Include 只得到一个孩子,则应用程序会开始递归。它得到父母,然后是它的所有孩子,他们所有的父母等等,直到我在客户端应用程序中出现“内存不足”异常。
我打开了 Newtonsoft.Json.ReferenceLoopHandling.Ignore,它帮助我查看表格,但它不适用于只加载一个孩子。
父对象:
public partial class Project
{
public long ProjectId { get; set; }
public string Name { get; set; }
public ICollection<Environment> Environments { get; set; }
}
父访问层:
public IEnumerable<Project> GetAllProjects()
{
try
{
return _context.Projects.ToList();
}
catch
{
return new List<Project>();
}
}
public Project GetProjectData(long id)
{
try
{
Project project = _context.Projects.Find(id);
return project;
}
catch { throw; }
}
子对象:
public partial class Environment
{
public long EnvironmentId { get; set; }
public string Name { get; set; }
public long ProjectId { get; set; }
public Project Project { get; set; }
}
子访问层:
public IEnumerable<Environment> GetAllEnvironments() // this one works fine
{
try
{
return _context.Environments
.Include(e => e.Project)
.ToList();
}
catch
{
return new List<Environment>();
}
}
public Environment GetEnvironmentData(long id) // this one starts endless recursion
{
try
{
Environment env = _context.Environments
.Where(e => e.EnvironmentId == id)
.Include(e => e.Project)
.FirstOrDefault();
return env;
}
catch { throw; }
}
现在我手动加载父对象,但最好弄清楚如何使用 Include 自动加载。
解决方案
想想您希望 JSON 是什么样子,您会发现您需要通过抑制导航属性之一的序列化来打破 JSON 序列化程序中的循环,可能是Environment.Project
.
推荐阅读
- python - 在本地运行 Python Azure 函数的 VSCode 失败并出现 ModuleNotFoundError
- php - Laravel Excel 导出 - 类型错误:传递给 Maatwebsite\Excel\Excel::download() 的参数 2 必须是字符串类型
- react-native - react-fetch-blob 使用 downloadManager 时不会调用进度
- c# - 您必须从 Disposed 订阅吗?
- javascript - Paylike 模态金额参数
- java - Hibernate 3 到 4 迁移
- c# - 找不到“Vektor2”
- bash - 检查第一列是否有 4 位数字,如果不是用零填充
- bash - 遍历 bash 中 curl 请求的列表
- c# - 我想将 SQL Server 2019 连接到 Unity 吗?如何摆脱这些错误?统一2019.2.11f1