Основная информация о EF Core

Entity Framework Core (EF Core) — это кроссплатформенная ORM для .NET, которая позволяет работать с базами данных через C# классы и LINQ, а не вручную писать SQL-запросы. EF Core поддерживает модели с сущностями и контекстом, миграции для эволюции схемы, а также множество провайдеров (SQLite, SQL Server и др.). Библиотека распространяется как набор NuGet-пакетов и работает как в Visual Studio, так и через .NET CLI на Windows, macOS и Linux. Кроме базового CRUD, современные версии EF Core поддерживают мощные возможности запросов и массовые операции вроде ExecuteUpdate/ExecuteDelete, а также загрузку связанных данных через Include.

Основные понятия EF Core

  1. DbContext (контекст базы данных): представляет собой основной класс, который управляет базой данных в коде (наследуется от Microsoft.EntityFrameworkCore.DbContext), например:

    public class AppDbContext : DbContext
     {
      // Коллекция сущностей (таблица Users)
      public DbSet Users { get; set; }
    
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
           // Для примера используем SQLite
           optionsBuilder.UseSqlite("Data Source=app.db");
      }
    }
  2. DbSet: набор сущностей, содержащихся в таблице базы данных, грубо говоря один DbSet = одной таблице в БД, например:
    public DbSet Users { get; set; }

  3. Сущности: представляют собой обычные С#-классы, которые описывают данные (обычно соответствующие таблицам в БД), например:
    public class User
    {
    public int Id { get; set; } // Первичный ключ
    public string Name { get; set; } // Имя пользователя
    public int Age { get; set; } // Возраст
    }

  4. Миграции: это механизм для изменения структуры базы данных при изменении моделей;

  5. Конфигурация сущности: используется для настройки отношений между сущностями, ограничения сущностей и т.д. Есть несколько способов задать конфигурацию сущности:

    • Conventions;

    • Data Annotations;

    • Fluent API;

    • Отдельные классы конфигурации Подробнее про каждый способ будет написано в другой статье.

  6. Отслеживание изменений (Change Tracking): EF Core поддерживает отслеживает изменения всех сущностей и при сохранении данных создаёт SQL-запрос на изменение БД.

Подходы к разработке БД

EF Core поддерживает 2 способа работы с базами данных:

  1. Database-first: модели и контекст базы данных создаются исходя из уже имеющейся базы данных;

  2. Model-first: изначально вы пишите модели данных, конфигурации моделей и контекст базы данных, из которых уже EF Core собирает базу данных.

Основные NuGet-пакеты

Далее кратко описаны составляющие набора пакетов для работы с EF Core.

  1. Базовые пакеты:

    • Microsoft.EntityFrameworkCore: главный пакет EF Core. Содержит ядро ORM, LINQ‑запросы, отслеживание изменений и работу с контекстом;

    • Microsoft.EntityFrameworkCore.Relational: дополнительный слой для реляционных СУБД (SQL Server, PostgreSQL, SQLite и др.). Включает поддержку транзакций, миграций, индексов, ограничений и т. д.

  2. Провайдеры баз данных:

    • Microsoft.EntityFrameworkCore.SqlServer: для Microsoft SQL Server;

    • Microsoft.EntityFrameworkCore.Sqlite: для SQLite;

    • Npgsql.EntityFrameworkCore.PostgreSQL: для PostgreSQL;

    • Pomelo.EntityFrameworkCore.MySql: для MySQL/MariaDB;

    • Oracle.EntityFrameworkCore: для Oracle Database;

    • Devart.Data.Oracle.EFCore: альтернативный провайдер Oracle от Devart;

    • FirebirdSql.EntityFrameworkCore.Firebird: для Firebird;

  3. Инструменты и вспомогательные пакеты:

    • Microsoft.EntityFrameworkCore.Tools Добавляет команды для Package Manager Console (Visual Studio);

    • Microsoft.EntityFrameworkCore.Design Нужен для генерации миграций и scaffolding (создание моделей из существующей базы);

    • Microsoft.EntityFrameworkCore.Proxies Поддержка ленивой загрузки (Lazy Loading) через динамические прокси;

    • Microsoft.EntityFrameworkCore.InMemory Провайдер для тестирования — хранит данные в памяти, без реальной БД;

Установка

Package Manager Console (PMC)

Чтобы установить какой-либо пакет через PMC необходимо открыть VisualStudio, в меню найти Tools - NuGet Package Manager - Package Manager Console. Пакет устанавливается командой Install-Package, например: Install-Package Microsoft.EntityFrameworkCore.

Установка через .NET CLI

Для установки пакетов необходимо открыть консоль через команду cmd. Чтобы установить пакет используют команду dotnet add package, например: dotnet add package Microsoft.EntityFrameworkCore.
Для управления миграциями базы данных и моделями данных (если используется метод Database-first) способа требуется установки дополнительного инструмента dotnet ef, который как раз таки и позволяет работать с EF Core из командной строки: dotnet tool install --global dotnet-ef.

Пример использования

Ниже приведён пример программы для управления блогами и постами, используется SQLite:

Установка пакетов

Необходимо установить следующие пакеты (способ через Packets Manager Console):

  1. Install-Package Microsoft.EntityFrameworkCore

  2. Install-Package Microsoft.EntityFrameworkCore.Sqlite

  3. Install-Package Microsoft.EntityFrameworkCore.Design

  4. Install-Package Microsoft.EntityFrameworkCore.Tools

BloggingContext.cs

using Microsoft.EntityFrameworkCore;
using Blogging.Models;

public class BloggingContext : DbContext
{
	//Таблицы БД 
    public DbSet Blogs = null!;
    public DbSet Posts = null!;

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
		//Подключение к базе данных
        options.UseSqlite("Data Source=blogging.db");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Пример конфигурации
        modelBuilder.Entity()
            .HasMany(b = b.Posts)
            .WithOne(p = p.Blog)
            .HasForeignKey(p = p.BlogId);
    }
}

Blog.cs

using System.Collections.Generic;

namespace Blogging.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; } = string.Empty;
public List Posts { get; } = new();
}
}

Post.cs

namespace Blogging.Models
{
  public class Post
  {
    public int PostId { get; set; }
    public string Title { get; set; } = string.Empty;
    public string Content { get; set; } = string.Empty;
    public int BlogId { get; set; }
    public Blog? Blog { get; set; }
  }
}

Инициализация миграции

Далее необходимо выполнить команды (в примере в PMC):

  1. add-migration MigrationName

  2. update-database

Комментарии (4)


  1. TheCat174
    03.10.2025 13:09

    Объясните, какой смысл от такой статьи? Это же буквально базовые знания, которые имеются в оф. документации Microsoft. Или это для того, чтобы очередной новорег смог карму людям снижать?


    1. artxmix Автор
      03.10.2025 13:09

      Просто структурирую свои знания, а сюда выложил, если написал что-то неправильно и чтобы меня поправили.


      1. MANAB
        03.10.2025 13:09

        Я сейчас некрасиво поступлю, оценивая, но хотелось бы все же сказать - имхо это ну слишком уж малые знания по EntityFramework, и там нету никаких знаний/опыта про то, как, когда и в каких случаях/задачах лучше сделать.
        К примеру, как обновлять атомарно поля сущностей только по их Id или определенному условию, когда использовать/не использовать Tracking, реализация транзакций, паттерны, использование хранимых процедур и т.д.


  1. kirichenec
    03.10.2025 13:09

    если написал что-то неправильно и чтобы меня поправили

    Это очередная нейро-копипаста мсдн? Ну вот какой смысл это людям видеть в ленте /агрегаторах новостей?

    Вы если что-то хотите спросить, лучше идите в тот же чат по дотнету (DotNetRuChat в тг, например) - там можно даже дурацкие вопросы задавать, это не зазорно. А вот такие вот тексты или в черновиках держать, или закладкой на мсдн.

    А так вы просто людей раздражаете пустыми кликами и разочарованием.

    Это может звучать обидно, но поставьте себя на место людей, которые сюда приходят за опытом, а видят одно и то же. Это всё же не жж, имхо