ORM для C# (.NET): Сравнение Entity Framework, Dapper и NHibernate

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

ORM для C# (.NET): Сравнение Entity Framework Core, Dapper и NHibernate

При разработке приложений на C# (.NET) выбор правильного ORM (Object-Relational Mapping) может существенно повлиять на производительность, скорость разработки и поддерживаемость кода. В этой статье мы подробно сравним три самых популярных ORM для экосистемы .NET: Entity Framework Core (EF Core), Dapper и NHibernate. Вы узнаете их сильные и слабые стороны, а также увидите конкретные примеры кода.

Что такое ORM и зачем он нужен?

ORM — это технология, которая позволяет работать с базами данных через объекты языка программирования, а не через прямые SQL-запросы. Для C# (.NET) ORM автоматизирует маппинг таблиц в классы, генерацию SQL, отслеживание изменений и управление транзакциями. Это ускоряет разработку, но может привести к потере производительности при неправильном использовании.

1. Entity Framework Core (EF Core)

EF Core — это современная, легковесная и расширяемая версия Entity Framework от Microsoft. Это полноценный ORM с мощным LINQ-провайдером, автоматическими миграциями и поддержкой множества СУБД (SQL Server, PostgreSQL, SQLite, MySQL и др.).

Преимущества:

  • Высокая скорость разработки благодаря Code-First и Database-First подходам.
  • Мощный LINQ-синтаксис для написания запросов.
  • Автоматическое отслеживание изменений (Change Tracker).
  • Встроенная поддержка миграций.

Недостатки:

  • Более медленный по сравнению с микро-ORM (из-за накладных расходов на отслеживание).
  • Сложности с оптимизацией сложных запросов (N+1 проблема).

Пример кода (EF Core):

// Модель
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

// Контекст базы данных
public class AppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDb;");
    }
}

// Использование
using (var db = new AppDbContext())
{
    // Добавление
    db.Users.Add(new User { Name = "Иван", Email = "ivan@example.com" });
    db.SaveChanges();
    
    // Запрос через LINQ
    var users = db.Users.Where(u => u.Name.StartsWith("И")).ToList();
    
    // Вывод
    foreach (var user in users)
    {
        Console.WriteLine($"{user.Id}: {user.Name}");
    }
}

2. Dapper

Dapper — это микро-ORM, созданный командой Stack Overflow. Он практически не добавляет накладных расходов и работает напрямую с ADO.NET. Dapper идеален для проектов, где критична производительность и полный контроль над SQL.

Преимущества:

  • Максимальная производительность (близкая к "голым" ADO.NET запросам).
  • Простота и минимализм (один файл, несколько методов-расширений).
  • Полный контроль над SQL-запросами.
  • Легко встраивается в существующие проекты.

Недостатки:

  • Нет отслеживания изменений (все ручное).
  • Нет автоматических миграций.
  • Требуется писать SQL-запросы вручную.

Пример кода (Dapper):

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

// Использование Dapper
using (var connection = new SqlConnection(@"Server=(localdb)\mssqllocaldb;Database=MyDb;"))
{
    connection.Open();
    
    // Вставка
    var sqlInsert = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)";
    connection.Execute(sqlInsert, new { Name = "Петр", Email = "petr@example.com" });
    
    // Запрос
    var sqlSelect = "SELECT * FROM Users WHERE Name LIKE @Prefix";
    var users = connection.Query<User>(sqlSelect, new { Prefix = "П%" }).ToList();
    
    foreach (var user in users)
    {
        Console.WriteLine($"{user.Id}: {user.Name}");
    }
}

3. NHibernate

NHibernate — это порт знаменитого Hibernate для Java. Это мощный и зрелый ORM с богатыми возможностями кэширования, ленивой загрузки и сложными стратегиями маппинга. Он чаще используется в legacy-проектах и корпоративных системах.

Рекомендаций