Работа с 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 методы) или удалять (используяRemoveAdd) сущности в контексте с помощью этих свойств. Доступ к свойству объекта контекста представляет начальный DbSet запрос, возвращающий все сущности указанного типа. Обратите внимание, что только доступ к свойству не будет выполнять запрос. Запрос выполняется при выполнении:

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