Что такое EF


Entity Framework (EF) — это объектно-реляционный отображатель (ORM, Object-Relational Mapper) от Microsoft для .NET, который позволяет разработчикам работать с базой данных, используя .NET-объекты, не прибегая к написанию большого количества SQL-кода. Он обеспечивает мост между объектно-ориентированным программированием и реляционными базами данных.

🧱 Основные задачи EF

Entity Framework автоматизирует следующие процессы:

  • Создание и отображение моделей данных на таблицы базы данных.

  • Генерация SQL-запросов на основе LINQ-выражений.

  • Автоматическое отслеживание изменений в сущностях и сохранение изменений в БД.

  • Управление связями между сущностями: one-to-many, many-to-many и т.д.

🔄 Подходы к использованию EF

Entity Framework поддерживает три основных подхода к разработке:

1. Database First

  • Начинается с уже существующей базы данных.

  • EF создает C#-классы (модели) на основе структуры таблиц.

  • Обычно используется в проектах, где база уже развернута и используется другими системами.

2. Model First

  • Разработка начинается с визуальной модели (EDMX-файл), которая затем компилируется в SQL-таблицы.

  • Подходит для визуального проектирования схем данных.

3. Code First

  • Разработка начинается с C#-классов.

  • EF автоматически создает таблицы в базе данных.

  • Предпочтительный подход в новых проектах с гибкой архитектурой.

📘 Компоненты Entity Framework

  • DbContext: основной класс, предоставляющий доступ к базе данных и управлению объектами.

  • DbSet: коллекция сущностей определенного типа, представляющая таблицу в БД.

  • Entity Classes (POCOs): простые классы, представляющие данные.

  • LINQ to Entities: позволяет использовать LINQ для выполнения запросов к базе данных.

Пример:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public class StoreContext : DbContext
{
public DbSet<Product> Products { get; set; }
}

⚙️ Миграции (Migrations)

EF поддерживает миграции — способ управления версионностью схемы базы данных:

  • Позволяет добавлять/изменять таблицы без ручного изменения SQL.

Генерация миграций через команды:

<br/>Add-Migration AddProductsTable
Update-Database

🛠 Преимущества EF

  • Автоматизация: упрощает работу с БД, избавляя от необходимости писать SQL вручную.

  • Типобезопасность: использование C#-типов снижает ошибки, связанные с несоответствием типов.

  • Отслеживание изменений: EF может автоматически обнаруживать, какие поля были изменены.

  • Интеграция с LINQ: запросы к БД можно писать в виде C#-кода.

  • Поддержка кэширования и ленивой загрузки (Lazy Loading).

🧪 Пример использования EF Code First

// Модель
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
// Контекст
public class AppDbContext : DbContext
{
public DbSet&lt;Customer&gt; Customers { get; set; }
}
// Пример кода
using (var context = new AppDbContext())
{
var customer = new Customer { Name = "John" };
context.Customers.Add(customer);
context.SaveChanges();
}

🧠 Отслеживание изменений

EF использует механизм Change Tracker, чтобы определить:

  • какие объекты были добавлены,

  • какие — изменены,

  • какие — удалены.

Когда вызывается SaveChanges(), EF создает соответствующие SQL-запросы на основе этих данных.

🧰 Lazy Loading, Eager Loading и Explicit Loading

  • Lazy Loading: связанные сущности загружаются при первом доступе к ним.

Eager Loading: загрузка всех нужных данных сразу с помощью Include():

var orders = context.Orders.Include(o => o.Customer).ToList();

Explicit Loading: явная загрузка связанных данных вручную:

context.Entry(order).Reference(o => o.Customer).Load();

⚠️ Недостатки EF

  • Меньшая производительность по сравнению с «ручным» ADO.NET.

  • Более сложное поведение при высоконагруженных сценариях.

  • Возможность генерации неоптимальных SQL-запросов.

  • Не всегда удобно использовать с legacy-базами, где схемы нестандартны.

🧬 Entity Framework Core

EF Core — кроссплатформенная, модернизированная версия EF:

  • Работает на .NET Core, .NET 5/6/7/8.

  • Легче, быстрее, модульнее.

  • Поддерживает больше баз данных: SQL Server, PostgreSQL, MySQL, SQLite, In-Memory и др.

  • Миграции, Fluent API, кастомные конвенции.

Пример настройки через OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity&lt;Customer&gt;()
.Property(c => c.Name)
.IsRequired()
.HasMaxLength(50);
}

Entity Framework является мощным инструментом ORM для .NET-разработчиков, позволяющим сократить время разработки, повысить читаемость и типобезопасность кода при взаимодействии с базами данных.