В прошлой теме база данных изначально не существовала и создавалась автоматически в процессе запуска приложения в соответствии с определением классов моделей и класса контекста данных. Но нередко база данных для подключения уже имеется. Рассмотрим, как мы можем подключаться к уже существующей базе данных.
Для подключения к существующей базе данных создадим новый проект консольного проекта по типу Console App, который назовем DBFirstApp.
Для работы возьмем какую-нибудь базу данных SQLite, например, созданную в прошлой теме. В моем случае база данных называется helloapp.db и имеет одну значимую таблицу Users с тремя столбцами Id, Name и Age.
Для работы с существующей БД 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
Если мы работаем через .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