По умолчанию для модели структуры сущностей включена отложенная загрузка.
Когда вы return Ok(customers);
API попытаетесь сериализовать сущности, чтобы они могли быть отправлены как (вероятно) JSON или XML , Поскольку он сериализуется через каждую сущность клиента, он встречает свойство Bookings
. Поскольку сериализатор запрашивает это свойство, Entity Framework будет «лениво загружаться» в бронированиях, связанных с клиентом. Затем сериализатор попытается сериализовать каждое бронирование и нажать на свойство Accommodations
... и т. Д.
Ваш код выше возвращает всех клиентов, поэтому вы в конечном итоге вернете все забронированные номера. Я ожидаю, что если вы сделаете новый Accommodation
, у которого нет заказов, он не будет возвращен в выводе этого вызова.
Есть несколько способов предотвратить все это:
Отключить отложенную загрузку
Вы можете отключить отложенную загрузку на модели EF, открыв модель, щелкнув правой кнопкой мыши на белом фоне диаграммы модели и выбрав «Свойства», затем установите «Включенная отложенная загрузка» в «False».
Если у вас есть другие функции, для которых вы хотите получить доступ к связанным свойствам из сущности, то вы можете либо загрузить их в контекст с помощью «Включить», либо загрузить их отдельно и разрешить присоединение к исправлению EF сущности вместе.
Мое личное мнение таково, что отключение отложенной загрузки, как правило, является хорошей идеей, поскольку заставляет задуматься о запросах, которые вы делаете к базе данных, и вам нужно быть гораздо более четким в вопросе о том, какие данные должны быть возвращены. , Тем не менее, это может быть гораздо больше усилий, и, вероятно, на это стоит обратить внимание, когда вы начнете пытаться оптимизировать свое приложение, а не просто заставить его работать.
Эта страница Microsoft " Загрузка связанных объектов"также объясняет различные варианты (а также точно описывает проблему с ленивой загрузкой всей базы данных!).
Сопоставление ваших сущностей и возврат DTO
У вас больше контроля над тем, как код пересекает вашу модель, если вы отображаете сущности из EF в DTO.
С точки зрения API использование DTO - отличная идея, поскольку позволяет более или менее определить выходные данные конечной точки, например, интерфейса. Это может часто оставаться тем же самым, в то время как основная структура данных может измениться. Возврат выходных данных модели EF означает, что если модель изменится, вещи, использующие эти данные, также могут нуждаться в изменении.
Нечто подобное AutoMapper часто используется для сопоставления объекта EF в DTO.
Настройки сериализатора
Могут быть некоторые настройки форматера медиа-типа, которые позволяют ограничить глубину объектов, которые будут проходить для сериализации. См. JSON и XML Сериализация в ASP. NET Web API , где можно начать.
Возможно, это слишком широкое изменение, и когда вы действительно хотите вернуться связанные объекты могут вызвать проблемы там.