Проблема: бесконечная рекурсивная загрузка связанных объектов (Blazor + EF 3.1.1) - PullRequest
0 голосов
/ 12 февраля 2020

Я недавно начал работать с Blazor и Entity Framework и столкнулся с проблемой, которую не знаю, как правильно решить:

Я использую сервер Blazor + веб-сборка и подход, основанный на коде, для БД. У меня есть 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; }
}

Дочерний object:

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.

Я загрузил этот проект в GitHub

1 Ответ

2 голосов
/ 12 февраля 2020

Подумайте, как вы хотите, чтобы JSON выглядел, и вы увидите, что вам нужно разорвать цикл в вашем JSON сериализаторе путем подавления сериализации одного из свойств навигации, вероятно Environment.Project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...