Работа с 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; }
}

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

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

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

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