ORM для C# (.NET): сравнение и примеры использования

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

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

Начать курс

ORM для C# (.NET): обзор, сравнение и примеры

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

1. Entity Framework Core (EF Core)

EF Core — это официальный ORM от Microsoft, который является наследником Entity Framework 6. Он поддерживает Code First, Database First и Model First подходы, а также предоставляет мощный LINQ-провайдер для построения запросов.

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

  • Высокая абстракция — минимум SQL-кода.
  • Автоматические миграции и управление схемой БД.
  • Поддержка множества провайдеров (SQL Server, PostgreSQL, SQLite, MySQL).
  • Глубокая интеграция с ASP.NET Core.

Недостатки:

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

Пример кода:

// Модель
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// Контекст
public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer("YourConnectionString");
}

// Использование
using var db = new AppDbContext();
var cheapProducts = db.Products
    .Where(p => p.Price < 100)
    .OrderBy(p => p.Name)
    .ToList();

2. Dapper

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

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

  • Экстремально быстрый — почти как чистый ADO.NET.
  • Минимальное потребление памяти.
  • Полный контроль над SQL-запросами.
  • Подходит для high-load систем.

Недостатки:

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

Пример кода:

using (var connection = new SqlConnection("YourConnectionString"))
{
    var products = connection.Query<Product>(
        "SELECT * FROM Products WHERE Price < @Price ORDER BY Name",
        new { Price = 100 });
    
    // Множественные результаты
    using (var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories"))
    {
        var prods = multi.Read<Product>();
        var cats = multi.Read<Category>();
    }
}

3. NHibernate

NHibernate — это порт популярного Java-фреймворка Hibernate. Он предоставляет полную реализацию JPA-подобного подхода с мощным кэшированием и поддержкой сложных иерархий наследования.

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

  • Развитая система кэширования (первый и второй уровни).
  • Поддержка Lazy Loading, HQL (Hibernate Query Language).
  • Гибкая настройка маппинга через XML или Fluent API.
  • Хорошо подходит для legacy-проектов.

Недостатки:

  • Сложная конфигурация и крутой порог входа.
  • Медленнее Dapper и EF Core на простых запросах.
  • Редко обновляется по сравнению с EF Core.

Пример кода:

// Маппинг через Fluent
public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        Map(x => x.Name).Not.Nullable();
        Map(x => x.Price);
    }
}

// Использование
using (var session = sessionFactory.OpenSession())
{
    var products = session.Query<Product>()
        .Where(p => p.Price < 100)
        .OrderBy(p => p.Name)
        .ToList();
}

Сравнение производительности (бенчмарки)

По результатам тестов Dapper показывает скорость, близкую к сырому ADO.NET (примерно 95-98% от эталона). EF

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