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