Использование .Include () в запросе к базе данных создает бесконечный цикл данных - PullRequest
0 голосов
/ 12 декабря 2018

Проблема : я использую LINQ для запроса контекста Entity Framework к реляционной базе данных.Следуя EFCore Relationships , я создал базу данных с несколькими связями, но когда я отправил данные на сервер с использованием ASP.NET, я получил нулевые значения для этих связей.

Немного покопавшись, я обнаружил, что мне нужно использовать _context.Post.Include("Blog") для отправки данных, поскольку он использует отложенную загрузку.Однако, делая это, он создал «бесконечный цикл» в JsonResult.

Данные, которые в итоге возвращаются, по-видимому, разрезаны пополам, и я получаю ошибки синтаксического анализа JSON при загрузке, потому что отсутствует вторая половина данных JSON.

Пример возвращаемого значения

{"id": 0, "blogId": 1, "blog": {"postId":0

Это все, что он возвращает, так как все, что после этого postId будет ссылкой на исходное сообщение, которое, в свою очередь, имеет ссылку на блог.Есть ли способ, которым я могу использовать LINQ для исключения объекта post в возврате, аналогично тому, как блог был включен в первую очередь?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Исправлена!Я взял модель из базы данных с включенными отношениями, а затем использовал foreach для обнуления обратной ссылки.

var blog = await _context.Blog
    .Include(x => x.Posts)
    .SingleAsync(x => x.Id == id);

foreach (Post post in blog.Posts)
{
    post.Blog = null;
}
return Ok(blog);
0 голосов
/ 13 декабря 2018

Это проблема сериализации JSON.Ищите, как решить проблему "Circure Reference" в документации по сериализатору потоков JSON.Различные потоковые сериализаторы предоставляют разные решения:

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

Другое решение - не использовать потоковые сериализаторы - настроить функцию сериализатора на месте.

И еще одно - использовать классы DTO (там, где нет циклических ссылок).

Вы также можете попытаться отделить свои объекты и установить нулевое значение для каждого свойства навигации, которое вы хотите игнорировать, но это ужасно и не может быть рекомендовано.

...