EF Core. Управление базой данных (свойство Database контекста)

Так или иначе, при работе с EF Core мы уже выполняли действия по управлению базой данных в EF Core, используя для этого свойство DbContext.Database. Сегодня более подробно рассмотрим некоторые методы этого свойства, которые мы можем использовать для управления базой данных в EF Core.

Как нам уже известно, когда мы создаем контекст данных, то наследуем наш класс от базового класса DbContext, например:

public partial class UsersContext : DbContext
{
    public UsersContext()
    {
    }

    public UsersContext(DbContextOptions<UsersContext> options)
        : base(options)
    {
    }

    public virtual DbSet<User> Users { get; set; }
}

В результате такого наследования нам становится доступны различные методы и свойства базового класса, которые мы можем, при необходимости, переопределять. В числе прочего, нам доступно свойство DbContext.Database типа DatabaseFacade, которое предоставляет доступ к сведениям и операциям, связанным с базой данных. Рассмотрим некоторые методы, определенные у Database, которые могут нам пригодиться в дальнейшем, для управления базой данных.

EnsureCreated и EnsureCreatedAsync

Метод EnsureCreated позволяет нам убедиться перед выполнением каких-либо операций с данными в том, что база данных создана. Метод возвращают true, если база данных создана или false, если она уже существует. Метод действует следующим образом:

  • Если база данных существует и содержит таблицы, то никакие действия не предпринимаются.
  • Если база данных существует, но не содержит таблиц, то EF Core создаст необходимые таблицы, используя определенную нами модель данных.
  • Если база данных не существует, то создается база данных и необходимые таблицы.

Соответственно, метод EnsureCreatedAsync действует аналогичным образом, но выполняется асинхронно (про асинхронность в C# можно прочитать здесь). Не обязательно вызывать эти методы непосредственно в конструкторе контекста, как мы это делали ранее. Вызывать методы можно где угодно, если создан экземпляр контекста данных. Например,

List<User>? users;
protected override void OnInitialized()
{
    using (var db = _db.CreateDbContext())
    {
        if (db.Database.EnsureCreated()) 
          users = db.Users.ToList();
    }
}

здесь мы использовали фабрику контекстов и создав контекст данных сразу же вызвали метод EnsureCreated, чтобы убедиться, что БД создана и можно прочитать список пользователей.

EnsureDeleted и EnsureDeletedAsync

Эти два метода позволяют нам убедиться в том, что база данных не существует. Если база данных существует, то вызов EnsureDeleted или EnsureDeletedAsync полностью удалит базу данных. Если же база данных в момент вызова методов итак не существует, то никакие действия не выполняются.

Методы EnsureDeleted/EnsureDeletedAsync, обычно, удобно использовать при тестировании приложения совместно с методами EnsureCreated/EnsureCreatedAsync, когда нам необходимо при каждом запуске иметь гарантированно пустую базу данных (или содержащую только какие-либо тестовые наборы данных). Например,

using (var db = DbFactory.CreateDbContext())
{
    db.Database.EnsureDeleted();
    if (db.Database.EnsureCreated()) 
      users = db.Users.ToList();
}

Итого

Сегодня мы рассмотрели один из наиболее простых способов управления базой данных в EF Core — с использованием методов EnsureCreated/EnsureDeleted. Эти методы удобно использовать при разработке приложения, когда необходимо быть уверенным, что используется чистая база данных (либо пустая, либо содержащая строго заданный набор начальных данных). Это не единственный способ управления базой данных, доступный в EF Core. С ещё одним способом мы познакомимся в следующей части руководства.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии