Entity Framework представляет прекрасное ORM-решение, которое позволяет автоматически связать обычные классы языка C# с таблицами в базе данных. Entity Framework Core поддерживает различные СУБД, но в данном случае мы будем работать с базами данных MS SQL Server.
Для работы с Entity Framework вначале создадим новый проект ASP.NET Core по шаблону ASP.NET Core Empty.
Для взаимодействия с MS SQL Server через Entity Framework необходим пакет Microsoft.EntityFrameworkCore.SqlServer. По умолчанию он отсутствует в проекте, поэтому его надо добавить, например, через пакетный менеджер Nuget:
Далее создадим в проекте папку Models и в нее добавим новый класс, который назовем User:
public class User { public int Id { get; set; } public string? Name { get; set; } // имя пользователя public int Age { get; set; } // возраст пользователя }
Эта модель представляет те объекты, которые будут храниться в базе данных.
Чтобы взаимодействовать с базой данных через Entity Framework нам нужен контекст данных - класс, унаследованный от класса Microsoft.EntityFrameworkCore.DbContext. Поэтому добавим в папку Models новый класс, который назовем ApplicationContext:
using Microsoft.EntityFrameworkCore; namespace MvcApp.Models { public class ApplicationContext : DbContext { public DbSet<User> Users { get; set; } = null!; public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options) { Database.EnsureCreated(); // создаем базу данных при первом обращении } } }
Свойство DbSet представляет собой коллекцию объектов, которая сопоставляется с определенной таблицей в базе данных. При этом по умолчанию название свойства должно соответствовать множественному числу названию модели в соответствии с правилами английского языка. То есть User - название класса модели представляет единственное число, а Users - множественное число.
Через параметр options
в конструктор контекста данных будут передаваться настройки контекста.
В конструкторе с помощью вызова Database.EnsureCreated()
по определению моделей будет создаваться база данных (если она отсутствует).
Чтобы подключаться к базе данных, нам надо задать параметры подключения. Для этого изменим файл appsettings.json, добавив в него определение строки подключения:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=usersdb;Trusted_Connection=True;" }, // остальное содержимое файла }
В данном случае мы будем использовать упрощенный движок базы данных LocalDB, который представляет легковесную версию SQL Server Express, предназначенную специально для разработки приложений.
И последним шагом в настройке проекта является изменение файла Program.cs:
using Microsoft.EntityFrameworkCore; using MvcApp.Models; // пространство имен класса ApplicationContext var builder = WebApplication.CreateBuilder(args); // получаем строку подключения из файла конфигурации string connection = builder.Configuration.GetConnectionString("DefaultConnection"); // добавляем контекст ApplicationContext в качестве сервиса в приложение builder.Services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(connection)); builder.Services.AddControllersWithViews(); var app = builder.Build(); app.MapDefaultControllerRoute(); app.Run();
Добавление контекста данных в виде сервиса позволит затем получать его в конструкторе контроллера через механизм внедрения зависимостей.
Поскольку выше в приложении контекст данных добавляется в виде сервиса, то в конструкторе контроллера мы можем получить переданный контекст данных. Например, пусть для хранения контроллеров в проекте определена папка Controllers, в которой есть класс контроллера - HomeController:
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using MvcApp.Models; namespace MvcApp.Controllers { public class HomeController : Controller { ApplicationContext db; public HomeController(ApplicationContext context) { db = context; } } }
Для взаимодействия с базой данных в контроллере определяется переменная контекст данных ApplicationContext db
. Причем
поскольку в приложении контекст данных добавляется в виде сервиса, то в конструкторе контроллера мы можем получить переданный контекст данных.