Как сохранить DbContext в подключенном состоянии с помощью веб-API - PullRequest
0 голосов
/ 23 апреля 2019

Поскольку веб-API не имеют состояния, когда у вас есть серверная часть EF Core после любого запроса, DbContext будет отключен.

Поэтому мы сделали QueryTracking как NoTracking, поскольку поведение по умолчанию TrackAll не дает никакой выгоды, поскольку его веб-приложение

DbContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

Есть ли способ сохранить DbContext в подключенном состоянии при использовании через веб-API?

например:

  • Запрос 1: информация о клиенте получена из Web API
  • Запрос 2: информация о клиенте сохраняется через другую конечную точку.

Есть ли способ повторно использовать / поддерживать в подключенном состоянии для вышеуказанного сценария?

1 Ответ

7 голосов
/ 23 апреля 2019

Вы, кажется, страдаете от ряда заблуждений / недоразумений. Во-первых, честно, соединения полностью отделены от отслеживания, состояния и всего остального. В частности, если вы используете пул соединений, одно и то же соединение с базой данных вполне может использоваться для множества разных запросов и даже для контекстных экземпляров. Тот факт, что контекст удален, не означает, что соединение с базой данных также закрыто. Аналогично, создание экземпляра контекста не всегда означает создание нового соединения.

Во-вторых, отслеживание запросов связано с кэшем объектов EF и отслеживанием изменений. Отключение этой функции может иметь некоторые преимущества, поскольку кэш и отслеживание изменений потребляют некоторое количество ресурсов. Однако это также может отрицательно повлиять на производительность в зависимости от типа выполняемых вами запросов. В частности, кэш объектов может препятствовать тому, чтобы последующие запросы даже не требовались, если объекты уже были получены с помощью других средств. Но, что важно, кеш объекта тесно связан с экземпляром контекста и поэтому имеет то же время жизни, что и сам контекст. Он не сохраняется в запросах, которые вы, похоже, понимаете, но действительно сохраняется в операциях, выполняемых в рамках одного конвейера запросов, который, как вам кажется, не понятен. Контекст может потенциально использоваться любое количество раз в течение одного запроса, поэтому в отслеживании запросов все еще есть значение. Вместо того, чтобы полностью отключить его, вы должны выбирать в каждом конкретном случае, когда не следует использовать его, добавляя .AsNoTracking() к запросу, если это имеет смысл делать в конкретных обстоятельствах.

В-третьих, HTTP не имеет состояния, а не только веб-API. Даже традиционные веб-приложения с возвратом HTML не сохраняют состояния. Такие вещи, как Session, являются поддельным состоянием. Каждый HTTP-запрос является полностью уникальным, не затрагиваемым и не подверженным влиянию всего, что происходило до или после этого между клиентом и сервером. В случае сессий, аутентификации и т. Д. Идентификатор передается клиенту с сервера (cookie), и клиент отправляет его обратно на сервер с каждым последующим запросом. Это позволяет создать иллюзию состояния, но каждый раз она действительно создается заново.

Таким образом, нет способа сохранить результаты запроса между запросами, кроме как использовать что-то вроде Session или кеш. Даже тогда результат для ваших целей здесь не будет работать, так как данные должны быть сериализованы / десериализованы, удаляя любые связи с любым видом отслеживания состояния, т.е. это просто данные, а EF, например, ничего не будет знать об этом или как сохранить изменения в нем.

...