Подключение к существующей базе данных

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

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

Для подключения к существующей базе данных создадим новый проект консольного проекта по типу Console App, который назовем DBFirstApp.

Для работы возьмем какую-нибудь базу данных SQLite, например, созданную в прошлой теме. В моем случае база данных называется helloapp.db и имеет одну значимую таблицу Users с тремя столбцами Id, Name и Age.

Определение базы данных в Entity Framework и SQLite

Для работы с существующей БД SQLite нам надо добавить в проект два Nuget-пакета:

  • Microsoft.EntityFrameworkCore.Sqlite (представляет функциональность Entity Framework для работы с SQLite)

  • Microsoft.EntityFrameworkCore.Design (необходим для создания классов по базе данных, то есть reverse engineering)

dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design

Чтобы подключаться к базе данных, нам надо будет добавить в проект классы моделей, которые соответствуют определениям таблиц, и класс контекста данных, который соответствует БД. То есть в данном случае мы могли бы вручную добавить в проект классы моделей и класс контекста данных, как в прошлой теме.

Однако добавление классов вручную имеет свои недостатки. Так, если база данных имеет не одну, а множество таблиц, связанных различными ключами, то у нас может возникнуть проблема, как все эти отношения отобразить между класса на C#. Ну и кроме того, это просто долго и может занять некоторое время.

Для решения этих проблем в Entity Framework Core предусмотрена функция Reverse Engineering, которая позволяет автоматически создать все необходимые классы по базе данных.

Для реверса базы данных и создания по ней классов C# в Visual Studio в окне Package Manager Console выполняется следующая команда:

Scaffold-DbContext "строка подключения" провайдер_бд

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

Если мы используем .NET CLI, то сначала нам надо установить инструменты для работы с EF Core с помощью команды:

dotnet tool install --global dotnet-ef

А затем выполняется следующая команда

dotnet ef dbcontext scaffold "строка подключения" провайдер_бд

Допустим, у нас база данных SQLite имеет полный путь "D:\\helloapp.db". Чтобы создать по этой базе данных классы C#, если мы работаем в Visual Studio, то надо перейти к окну Package Manager Console (оно доступно через меню Tools –> NuGet Package Manager –> Package Manager Console). Далее в Package Manager Console выполним следующую команду:

Scaffold-DbContext "Data Source=D:\\helloapp.db" Microsoft.EntityFrameworkCore.Sqlite
Reverse Engineering in Entity Framework Core и C#

Если мы работаем через .NET CLI, то ндо выполнить команду

dotnet ef dbcontext scaffold "Data Source=D:\\helloapp.db" Microsoft.EntityFrameworkCore.Sqlite

После выполнения этой команды в проект будет добавлен класс User:

namespace HelloApp;

public partial class User
{
    public long Id { get; set; }

    public string? Name { get; set; }

    public long Age { get; set; }
}

И также будет добавлен класс контекста данных, который будет называться по имени базы данных плюс суффикс "Context":

using Microsoft.EntityFrameworkCore;

namespace HelloApp;

public partial class HelloappContext : DbContext
{

    public HelloappContext()
    {
    }

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

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

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseSqlite("Data Source=D:\\\\helloapp.db");


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        OnModelCreatingPartial(modelBuilder);
    }
 
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

И после генерации данных классов мы сможем работать с базой данных. Для этого изменим код файла Program:

using HelloApp;

using (HelloappContext db = new HelloappContext())
{
    // получаем объекты из бд и выводим на консоль
    var users = db.Users.ToList();
    Console.WriteLine("Список объектов:");
    foreach (User u in users)
    {
        Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
    }
}
Список объектов:
1.Tom - 33
2.Alice - 26
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850