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