Управление базой данных

Последнее обновление: 23.11.2021

Для управления базой данной в классе DbContext определено свойство Database, которое представляет тип Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade и которое предоставляет некоторый функционал для управления базой данных.

Database.EnsureCreated

Метод Database.EnsureCreated() и его асинхронная версия Database.EnsureCreatedAsync() гарантируют, что база данных будет создана.

Если база данных отсутствует, то данный метод создает ее.

Если база данных имеется, но она НЕ имеет таблиц, то этот метод создает таблицы, которые соответствуют схеме данных.

Если база данных имеется и она имеет таблицы, то этот метод не оказывает никакого влияния.

Данный метод можно вызвать в коде контекста данных, например, в конструкторе, чтобы гарантировать, что при вызове операций с данными БД уже создана:

using Microsoft.EntityFrameworkCore;

public class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
}
public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; } = null!;

    public ApplicationContext()
    {
        Database.EnsureCreated();	// гарантируем, что БД создана
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=helloapp456.db");
    }
}

Либо можно вызывать вне класса контекста данных там, где нам доступен его объект:

using (ApplicationContext db = new ApplicationContext())
{
    db.Database.EnsureCreated();
    // асинхронная версия
    await db.Database.EnsureCreatedAsync();
}

Метод возвращает true, если бд создана в результате вызова этого метода. Если база данных уже есть, то возвращается false.

using (ApplicationContext db = new ApplicationContext())
{
    bool isCreated = db.Database.EnsureCreated();
    // bool isCreated2 = await db.Database.EnsureCreatedAsync();
    if (isCreated) Console.WriteLine("База данных была создана");
    else Console.WriteLine("База данных уже существует");
}

Database.EnsureDeleted

Метод Database.EnsureDeleted() и его асинхронная версия Database.EnsureDeletedAsync() гарантируют, что база данных будет удалена.

Если база данных имеется, то она удаляется. Если база данных отсутствует, то этот метод не оказывает никакого влияния.

Данный метод можно вызвать в коде контекста данных, так и вне, где доступен объект контекста данных. Обычно данных метод применяется в паре с Database.EnsureCreated для пересоздания БД, например, когда нм надо иметь чистую бд без каких-либо данных для прототипироания и тестирования, например:

using Microsoft.EntityFrameworkCore;

public class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
}
public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; } = null!;

    public ApplicationContext()
    {
        Database.EnsureDeleted(); // гарантируем, что бд удалена
        Database.EnsureCreated(); // гарантируем, что бд будет создана
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=helloapp456.db");
    }
}

Либо вне класса контекста данных:

using (ApplicationContext db = new ApplicationContext())
{
    db.Database.EnsureDeleted();
    db.Database.EnsureCreated();
    // асинхронная версия
    await db.Database.EnsureCreatedAsync();
    await db.Database.EnsureDeletedAsync();
}

Метод возвращает true, если бд была удалена в результате вызова этого метода. Если база уже до вызова метода отсутствует, то возвращается false.

Database.CanConnect

Еще один метод, который стоит отметить, это Database.CanConnect() и его асинхронная версия Database.CanConnectAsync(). Данный метод возвращает true, если бд доступна, и false, если бд не доступна:

using (ApplicationContext db = new ApplicationContext())
{
    bool isAvalaible = db.Database.CanConnect();
	// bool isAvalaible2 = await db.Database.CanConnectAsync();
    if (isAvalaible) Console.WriteLine("База данных доступна");
    else Console.WriteLine("База данных не доступна");
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850