Задать вопрос
NikFaraday
@NikFaraday
Student full-stack Developer

Есть ли действие противоположное к .Include в Entity Framework?

Здравствуйте!

Отправляю сериализированный объект некого события куда мне нужно заинклудить исполнителя события, но у меня получается зацикливание, т.к. исполнитель также инклудит эти события ПОЧЕМУ-ТО. Как этого избежать?

Код запроса:
return await _repository.Entities
                .Include(ev => ev.Executor)
                .Where(ev => !ev.DeletedOn.HasValue)
                .ToListAsync();


Вот скриншот дебага:
62f53f8e4d880474713286.png

1е - сам список событий, которые я получаю через запрос выше
2е - ссылка на исполнителя, которого мне нужно заинклудить
3е - почему-то исполнитель имеет ссылка на те самые события, которые в свою очередь имеют ссылку на исполнителя и т.д., из-за чего, собственно, получается зацикливание.

Как исправить этот 3й пункт? Можно как-то отменить дальнейший "инклудинг" исполнителей?
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
А зачем это чинить на уровне EF, когда чинить надо на уровне сериализации?

Почему ты пытаешься возвращать модели из БД в контроллере, вместо маппинга?
(это на будущее - так делать не стоит, а то так по неосторожности ещё и конфиденциальную информацию на фронт выдашь)

Ещё вариант - можно в сериализаторе включить обработку цикличных ссылок через метод Configure JsonOptions:
builder.Services.Configure<JsonOptions>(options =>
{
    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});

То поведение, которое вы наблюдаете у себя - это нормально. (это в общем-то именно то, ради чего ORM и существует)
Когда ты делаешь Include - у тебя связи грузятся и из A в B и из B в A, но не в C.
ThenInclude нужен только чтобы прогрузить A -> B -> C
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы