Entity framework 问题:页面崩溃并消耗大量内存(Blazor&x2B;EF 3.1.1)

Entity framework 问题:页面崩溃并消耗大量内存(Blazor&x2B;EF 3.1.1),entity-framework,blazor,Entity Framework,Blazor,我最近开始使用Blazor和Entity Framework,遇到了一个我不知道如何正确解决的问题: 我使用Blazor服务器+webassembly和DB的代码优先方法。 我有两个一对多的实体,希望加载包含父对象的子对象。如果我得到一张桌子的所有子对象,一切都很好;然而,若通过使用包含的Where方法只得到一个子对象,那个么应用程序将启动一个递归。它会得到父对象,然后是它的所有子对象,它们的所有父对象等等,直到我在客户端应用程序中得到“内存不足”异常 我打开了Newtonsoft.Json.R

我最近开始使用Blazor和Entity Framework,遇到了一个我不知道如何正确解决的问题:

我使用Blazor服务器+webassembly和DB的代码优先方法。 我有两个一对多的实体,希望加载包含父对象的子对象。如果我得到一张桌子的所有子对象,一切都很好;然而,若通过使用包含的Where方法只得到一个子对象,那个么应用程序将启动一个递归。它会得到父对象,然后是它的所有子对象,它们的所有父对象等等,直到我在客户端应用程序中得到“内存不足”异常

我打开了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 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; }
}
public IEnumerable GetAllenEnvironments()//这一个很好用
{
尝试
{
return\u context.Environments
.包括(e=>e.Project)
.ToList();
}
抓住
{
返回新列表();
}
}
公共环境GetEnvironmentData(长id)//这一个开始无限递归
{
尝试
{
Environment env=\u context.Environments
.其中(e=>e.EnvironmentId==id)
.包括(e=>e.Project)
.FirstOrDefault();
返回环境;
}
接住{throw;}
}

目前,我正在手动加载父对象,但最好弄清楚如何使用Include自动加载它。

想想你希望JSON看起来像什么,你会发现你需要通过序列化一个导航属性来打破JSON序列化程序中的循环,可能是
环境。Project

考虑一下您希望JSON看起来是什么样子,您会发现您需要通过对其中一个导航属性(可能是
环境)的序列化来打破JSON序列化程序中的循环。Project

看起来解决方案非常简单,我没有检查“环境”对象的“项目”属性是否为null。在我把这个检查添加到页面后,问题就消失了

我仍然不确定页面在遇到“对象引用未设置为对象实例”错误后为什么会消耗大量内存

@if (env == null || env.Project == null)
{
    <strong>Loading...</strong>
}
else
{
    // page markup
}
@if(env==null | | env.Project==null)
{
加载…
}
其他的
{
//页面标记
}

看起来解决方案非常简单,我没有检查'Environment'对象的'Project'属性是否为null。在我把这个检查添加到页面后,问题就消失了

我仍然不确定页面在遇到“对象引用未设置为对象实例”错误后为什么会消耗大量内存

@if (env == null || env.Project == null)
{
    <strong>Loading...</strong>
}
else
{
    // page markup
}
@if(env==null | | env.Project==null)
{
加载…
}
其他的
{
//页面标记
}


您是否尝试使用include反转where子句?是的,它没有帮助,如果您执行where->toList->firstOrDefault?我已经尝试过了,但结果是一样的。首先,当在页面上调用@env.Project.Name时,我得到了“object reference is null”,但页面仍在使用CPU,客户端上的内存以几何级数消耗。我还尝试使用Linq查询,得到了相同的结果。查询:Environment env=(来自_context.Environments.Include(“项目”)中的e,其中e.EnvironmentId==id选择e);您是否尝试使用include反转where子句?是的,它没有帮助,如果您使用where->toList->firstOrDefault?我已经尝试过了,但结果是一样的。首先,当在页面上调用@env.Project.Name时,我得到了“object reference is null”,但页面仍在使用CPU,客户端上的内存以几何级数消耗。我还尝试使用Linq查询,得到了相同的结果。查询:Environment env=(来自_context.Environments.Include(“项目”)中的e,其中e.EnvironmentId==id选择e);谢谢我在Server project的两个类中都尝试过,下面是结果。若我将JsonIgnore添加到Environment.cs中的项目属性中,它将阻止加载带有环境的表。如果我在Project.cs中将JsonIgnore添加到Environments属性中,在我的情况下,它不会改变任何东西,页面仍然会进入无休止的递归。我下载了该项目,无法重新设置错误。你确定这不是误诊吗?在某些方法中,你正在吞咽异常,这是你永远不应该做的。我知道我还没有实现正常的异常处理,我现在只想专注于基本功能。尝试删除环境时出现此错误。我在这里上传了一个屏幕截图:我已经在获取数据的方法中注释掉了两个控制器的所有try-catch块,但在终端中仍然没有任何异常(我使用VSCode),页面仍然属于递归。我没有其他相关的文件,我复制了它。它似乎是一个挂起的blazor/web程序集,这超出了我的调试能力。谢谢。我在Server project的两个类中都尝试过,下面是结果。若我将JsonIgnore添加到Environment.cs中的项目属性中,它将阻止加载带有环境的表。如果我在Project.cs中将JsonIgnore添加到Environments属性中,在我的情况下,它不会改变任何东西,页面仍然会进入无休止的递归。我下载了该项目,无法重新设置错误。你确定这不是误诊吗?在某些方法中,你正在吞咽异常,这是你永远不应该做的。我知道我还没有实现正常的异常处理,我现在只想专注于基本功能。尝试删除环境时出现此错误。我在这里上传了一个屏幕截图:我已经在获取数据的方法中注释掉了两个控制器的所有try-catch块,但在终端中仍然没有任何异常(我使用VSCode),页面仍然属于递归。我没有其他相关的文件,我复制了它。这似乎是一个挂在blazor/web a上的问题