EF6: Как избежать круговой ссылки?

c# json asp.net-web-api entity-framework-6

9642 просмотра

2 ответа

6809 Репутация автора

Каковы возможности избежать циклической ссылки с Entity Framework 6 во время сериализации JSON с ASP.NET Web API?

Я создал файл edmx (Entity Data Model) для Entity Framework 6, сначала базу данных. Я пытаюсь создать API с помощью ASP.NET Web API. Когда я пытаюсь вернуть свой объект JSON в мои контроллеры, я получаю исключение во время выполнения сериализации из-за циклической ссылки.

Действительно, когда я дважды проверяю свою базу данных и мои сущности, я вижу, что одна из моих сущностей содержит список другой сущности, которая содержит список моих предыдущих сущностей. скажем, у меня есть сущность книги, которая содержит авторов, и каждая сущность автора содержит список книг. Это что-то общее с относительной базой данных, но ее невозможно разрешить в сериализации JSON (или невозможно разрешить для сериализатора .NET).

Я не хочу менять свою базу данных, но я готов разбить неправильный список на мои сущности или файл edmx. Что я могу сделать?

Что я пробовал:

Я уже попробовал решение, которое состоит из создания новых моделей или объектов и использования инструмента отображения ( http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-Ser или решение, объясненное Шоном Уайлдермутом на Pluralsight).

Это решение звучит скорее как обходной путь, чем как реальное решение. Он должен существовать в файле edmx или в Entity Framework, чтобы сообщить сериализатору JSON, что может вызвать циклическую ссылку, что можно и нужно сериализовать, а что нельзя сериализовать, верно?

Автор: Bastien Vandamme Источник Размещён: 19.07.2016 02:43

Ответы (2)


2 плюса

5463 Репутация автора

Не пытайтесь сериализовать модель вашего домена напрямую. Создайте модель представления, которая возвращает данные в нужном формате. Используйте модель вашего домена, чтобы заполнить модель представления. Здесь гораздо больше информации. Почему мы используем ViewModels?

Автор: Fran Размещён: 19.07.2016 02:48

6 плюса

6809 Репутация автора

Решение

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

  1. Удалите виртуальный перед каждой коллекцией вашей модели (в подходе кода сначала)
  2. установить для конфигурации отложенной загрузки значение false (при первом подходе к базе данных)
Автор: Bastien Vandamme Размещён: 03.10.2016 05:00
Вопросы из категории :
32x32