Работа с DbContext
Чтобы использовать Entity Framework для запроса, вставки, обновления и удаления данных с помощью объектов .NET, сначала необходимо создать модель , которая сопоставляет сущности и связи, определенные в модели, с таблицами в базе данных.
После создания модели основной класс, с которым System.Data.Entity.DbContext
взаимодействует приложение, (часто называется классом контекста). Для этого можно использовать DbContext, связанный с моделью:
- Написание и выполнение запросов
- Материализация результатов запроса в виде объектов сущностей
- Отслеживание изменений, внесенных в эти объекты
- Сохранение изменений объектов обратно в базе данных
- Привязка объектов в памяти к элементам управления пользовательского интерфейса
На этой странице приводятся некоторые рекомендации по управлению классом контекста.
Определение производного класса DbContext
Рекомендуемый способ работы с контекстом — определить класс, производный от DbContext, и предоставляет свойства DbSet, представляющие коллекции указанных сущностей в контексте. Если вы работаете с конструктором EF, контекст будет создан для вас. Если вы работаете с кодом First, обычно вы будете писать контекст самостоятельно.
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
После получения контекста вы будете запрашивать, добавлять (используя или Attach
методы) или удалять (используяRemove
Add
) сущности в контексте с помощью этих свойств. Доступ к свойству объекта контекста представляет начальный DbSet
запрос, возвращающий все сущности указанного типа. Обратите внимание, что только доступ к свойству не будет выполнять запрос. Запрос выполняется при выполнении:
- Запрос перечисляется с помощью инструкции
foreach
(C#) илиFor Each
(Visual Basic). - Она перечисляется операцией сбора, например
ToArray
,ToDictionary
илиToList
. - Операторы LINQ, такие как
First
илиAny
указаны в самой внешней части запроса. - Один из следующих методов вызывается:
Load
метод расширения,DbEntityEntry.Reload
Database.ExecuteSqlCommand
иDbSet<T>.Find
, если сущность с указанным ключом не найдена в контексте.
Время существования
Время существования контекста начинается, когда экземпляр создается и заканчивается, когда экземпляр удаляется или собирается мусор. Используйте использование, если требуется, чтобы все ресурсы, которые элементы управления контекстом были удалены в конце блока. При использовании компилятор автоматически создает блок try/finally и вызывает удаление в блоке, наконец.
public void UseProducts()
{
using (var context = new ProductContext())
{
// Perform data access using the context
}
}
Ниже приведены некоторые общие рекомендации при выборе времени существования контекста:
- При работе с веб-приложениями используйте экземпляр контекста для каждого запроса.
- При работе с Windows Presentation Foundation (WPF) или Windows Forms используйте экземпляр контекста для каждой формы. Это позволяет использовать функции отслеживания изменений, которые предоставляет контекст.
- Если экземпляр контекста создается контейнером внедрения зависимостей, обычно он несет ответственность за удаление контекста.
- Если контекст создается в коде приложения, не забудьте удалить контекст, когда он больше не требуется.
- При работе с длительным контекстом следует учитывать следующее:
- При загрузке дополнительных объектов и их ссылок в память потребление памяти контекста может быстро увеличиваться. Это может вызвать снижение производительности.
- Контекст не является потокобезопасной, поэтому он не должен совместно использоваться в нескольких потоках, выполняющих его одновременно.
- Если исключение приводит к тому, что контекст будет находиться в невосстановленном состоянии, все приложение может завершиться.
- Вероятность возникновения проблем с параллелизмом возрастает по мере увеличения разрыва между временем запроса и временем обновления данных.
Связи
По умолчанию контекст управляет подключениями к базе данных. Контекст открывает и закрывает подключения по мере необходимости. Например, контекст открывает соединение для выполнения запроса, а затем закрывает соединение при обработке всех результирующих наборов.
В некоторых случаях необходимо больше контроля над открытием и закрытием соединения. Например, при работе с SQL Server Compact часто рекомендуется поддерживать отдельное открытое подключение к базе данных в течение всего времени существования приложения, чтобы повысить производительность. Процессом можно управлять вручную с помощью свойства Connection
.