Получить запрос с отображением таблиц внешнего ключа - PullRequest
1 голос
/ 26 марта 2020

Когда у меня ничего нет в моей таблице заказов, мои конечные точки GET для моего клиента и таблицы размещения работают отлично. Как только я создаю бронирование, каждый запрос на получение каждой таблицы возвращает каждую запись в каждой таблице. Это моя модель данных

DataModel

Это мой запрос на получение клиентов

// GET: api/Customer
    [ResponseType(typeof(Customer))]
    public async Task<IHttpActionResult> GetCUSTOMERs()
    {
        var customers = await db.Customers.ToListAsync();
        return Ok(customers);
    }

Когда я вызываю запрос на получение для Таблица клиентов Я хочу только данные клиентов, как я могу это сделать?

1 Ответ

1 голос
/ 27 марта 2020

По умолчанию для модели структуры сущностей включена отложенная загрузка.

Когда вы 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 , где можно начать.
Возможно, это слишком широкое изменение, и когда вы действительно хотите вернуться связанные объекты могут вызвать проблемы там.

...