ORM для C# (.NET): сравнение и примеры
В современной разработке на платформе .NET работа с базами данных редко обходится без использования Object-Relational Mapping (ORM). ORM-библиотеки позволяют разработчикам взаимодействовать с реляционными базами данных через объектно-ориентированный код, избавляя от необходимости писать сложные SQL-запросы вручную. В этой статье мы сравним три самых популярных ORM для C#: Entity Framework Core, Dapper и LINQ to SQL, а также приведём практические примеры использования.
1. Entity Framework Core (EF Core)
EF Core — это современная, кроссплатформенная ORM от Microsoft, которая является эволюцией Entity Framework 6. Она поддерживает работу с различными СУБД (SQL Server, PostgreSQL, SQLite, MySQL и др.) и предоставляет мощные возможности для работы с данными.
Основные особенности:
- Code First / Database First — можно создавать базу данных на основе кода или наоборот.
- LINQ-запросы — запросы пишутся на C#, а EF Core преобразует их в SQL.
- Миграции — автоматическое управление схемой базы данных.
- Отложенная загрузка (Lazy Loading) — автоматическая загрузка связанных данных.
Пример кода (Code First):
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
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=.;Database=MyDb;Trusted_Connection=True;");
}
}
// Использование
using (var db = new AppDbContext())
{
// Добавление пользователя
var user = new User { Name = "Иван", Email = "ivan@example.com" };
db.Users.Add(user);
db.SaveChanges();
// Запрос через LINQ
var users = db.Users.Where(u => u.Name.Contains("Иван")).ToList();
}
Плюсы: Высокая производительность, богатый функционал, поддержка миграций, активное сообщество. Минусы: Больший объём памяти, сложность при настройке сложных запросов.
2. Dapper
Dapper — это легковесный micro-ORM, созданный командой Stack Overflow. Он не предоставляет полноценного маппинга, но позволяет выполнять SQL-запросы напрямую, автоматически маппя результаты в C#-объекты.
Основные особенности:
- Максимальная производительность — Dapper считается одним из самых быстрых ORM для .NET.
- Прямой SQL — вы пишете запросы на чистом SQL.
- Минимализм — нет миграций, контекстов и сложных конфигураций.
Пример кода:
using Dapper;
using System.Data.SqlClient;
using System.Linq;
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
// Использование
string connectionString = "Server=.;Database=MyDb;Trusted_Connection=True;";
using (var connection = new SqlConnection(connectionString))
{
// Выполнение SQL-запроса
var users = connection.Query<User>("SELECT * FROM Users WHERE Name = @Name", new { Name = "Иван" }).ToList();
// Выполнение хранимой процедуры
var result = connection.Query<User>("GetUsers", commandType: System.Data.CommandType.StoredProcedure);
}
Плюсы: Высокая скорость, простота, минимальное потребление ресурсов. Минусы: Отсутствие миграций, приходится писать SQL вручную, нет автоматической загрузки связанных сущностей.
3. LINQ to SQL
LINQ to SQL — это устаревшая ORM от Microsoft, которая была популярна в ранних версиях .NET Framework. Она позволяет работать с базами данных через LINQ, но поддерживает только SQL Server.
Основные особенности:
- Простота — минимальная настройка, быстрое начало работы.
- LINQ-запросы — аналогично EF, но с меньшим функционалом.
- Только SQL Server — не поддерживает другие СУБД.
Пример кода:
using System.Data.Linq;
using System.Linq;
[Table(Name = "Users")]
public class User
{
[Column(IsPrimaryKey = true)]
public int Id { get; set; }
[Column]
public string Name { get; set; }
[Column]
public string Email { get; set; Также в библиотеке
Cheerio для JavaScript (Node.js): полное руководство с примерами
Отправка SMS на Java: Обзор и примеры использования API библиотек (Twilio, Nexmo)
JWT токены в JavaScript (Node.js): Полное руководство
Логирование для Swift (iOS/macOS): лучшие библиотеки и решения
Contacts для Swift: полное руководство с примерами