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

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

Я использую Blazor server + webassembly и code-first подход для БД. У меня есть 2 сущности с отношением один ко многим, и я хочу загрузить дочерний объект с включенным родителем. Если я получу все дочерние объекты для таблицы, все будет хорошо; однако, если я получу только одного ребенка с помощью метода 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 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 ответ


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


Есть идеи?

10000