Что такое 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<Customer> 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<Customer>()
.Property(c => c.Name)
.IsRequired()
.HasMaxLength(50);
}
Entity Framework является мощным инструментом ORM для .NET-разработчиков, позволяющим сократить время разработки, повысить читаемость и типобезопасность кода при взаимодействии с базами данных.