首页 > 解决方案 > 问题:页面崩溃并消耗大量内存(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 自动加载。

标签: entity-frameworkblazor

解决方案


想想您希望 JSON 是什么样子,您会发现您需要通过抑制导航属性之一的序列化来打破 JSON 序列化程序中的循环,可能是Environment.Project.


推荐阅读