Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7
В прошлой теме база данных изначально не существовала и создавалась автоматически в процессе запуска приложения в соответствии с определением классов моделей и класса контекста данных. Но нередко база данных для подключения уже имеется. Рассмотрим, как мы можем подключаться к уже существующей базе данных.
Для подключения к существующей базе данных создадим новый проект. Как и в прошлой теме это будет проект по типу Console App (.NET Core), который назовем FirstApp.
Для работы с существующей БД MS SQL Server нам надо добавить два пакета:
Microsoft.EntityFrameworkCore.SqlServer (представляет функциональность Entity Framework для работы с MS SQL Server)
Microsoft.EntityFrameworkCore.Tools (необходим для создания классов по базе данных, то есть reverse engineering)
К примеру возьмем базу данных, созданную в прошлой теме. Эта база данных называется helloappdb.mdf и имеет одну таблицу Users с тремя столбцами Id, Name и Age.
Чтобы подключаться к базе данных, нам надо будет добавить в проект классы моделей, которые соответствуют определениям таблиц, и класс контекста данных, который соответствует БД. То есть в данном случае мы могли бы вручную добавить в проект классы моделей и класс контекста данных, как в прошлой теме.
Однако добавление классов вручную имеет свои недостатки. Так, если база данных имеет не одну, а множество таблиц, связанных различными ключами, то у нас может возникнуть проблема, как все эти отношения отобразить между класса на C#. Ну и кроме того, это просто долго и может занять некоторое время.
Для решения этих проблем в Entity Framework Core предусмотрена функция Reverse Engineering, которая позволяет автоматически создать все необходимые классы по базе данных. Чтобы воспользоваться этой функцией перейдем в Visual Studio к окну Package Manager Console. Его открыть можно, перейдя в меню Tools –> NuGet Package Manager –> Package Manager Console
Далее в Package Manager Console выполним следующую команду:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer
Здесь в качестве параметра команде Scaffold-DbContext передается строка подключения с указанием сервера и названием базы данных.
После выполнения этой команды в проект будет добавлен класс Users:
public partial class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
И также будет добавлен класс контекста данных, который будет называться по имени базы данных плюс суффикс "Context":
using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; #nullable disable namespace FirstApp { public partial class helloappdbContext : DbContext { public helloappdbContext() { } public helloappdbContext(DbContextOptions<helloappdbContext> options) : base(options) { } public virtual DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); } }
И после генерации данных классов мы сможем работать с базой данных. Для этого изменим код класса Program:
using System; using System.Linq; namespace FirstApp { class Program { static void Main(string[] args) { using (helloappdbContext db = new helloappdbContext()) { // получаем объекты из бд и выводим на консоль var users = db.Users.ToList(); Console.WriteLine("Список объектов:"); foreach (User u in users) { Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}"); } } Console.ReadKey(); } } }