Работа с DbContext

Чтобы использовать Entity Framework для запроса, вставки, обновления и удаления данных с помощью объектов .NET, необходимо сначала создать модель , которая сопоставляет сущности и связи, определенные в модели, с таблицами в базе данных.

После создания модели основной класс, с которым взаимодействует приложение, — это System.Data.Entity.DbContext (часто называется классом контекста). DbContext, связанный с моделью, можно использовать для:

  • Создание и выполнение запросов
  • Материализация результатов запросов в виде объектов сущностей
  • Отслеживание изменений, внесенных в эти объекты
  • Сохранить изменения объекта обратно в базе данных
  • Привязка объектов в памяти к элементам управления пользовательского интерфейса

На этой странице приводятся некоторые рекомендации по управлению классом контекста.

Определение производного класса DbContext

Для работы с контекстом рекомендуется определить класс, производный от DbContext и предоставляющий свойства DbSet, представляющие коллекции указанных сущностей в контексте. При работе с конструктором EF этот контекст будет создан автоматически. если вы работаете с Code First, вы обычно пишете контекст самостоятельно.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

После создания контекста необходимо запросить, добавить (использовать AddAttach методы или) или удалить (с помощью Remove ) сущности в контексте с помощью этих свойств. Доступ к DbSet свойству объекта контекста представляет собой начальный запрос, который возвращает все сущности указанного типа. Обратите внимание, что только доступ к свойству не приведет к выполнению запроса. Запрос выполняется в следующих случаях:

  • Запрос перечисляется с помощью инструкции foreach (C#) или For Each (Visual Basic).
  • Он перечисляется операцией сбора, например ToArray , ToDictionary или ToList .
  • Операторы LINQ, такие как First или Any , указываются в самой внешней части запроса.
  • Вызывается один из следующих методов: Load метод расширения,, DbEntityEntry.ReloadDatabase.ExecuteSqlCommand и DbSet<T>.Find , если сущность с указанным ключом не найдена в контексте уже загружена.

Время существования

Время существования контекста начинается при создании экземпляра и завершается, когда экземпляр удаляется или уничтожается сборщиком мусора. Используйте Использование , если требуется, чтобы все ресурсы, которые элемент управления контекста удалялись в конце блока. При использовании с помощьюкомпилятор автоматически создает блок try/finally и вызывает Dispose в блоке 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.