Я недавно начал работать с 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