Что такое ORM?

«Что такое ORM?» — вопрос из категории Entity Framework, который задают на 39% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ORM (Object-Relational Mapping, Объектно-реляционное отображение) — это технология, которая создает "мост" между объектно-ориентированным кодом приложения и реляционной базой данных. Она автоматически маппирует (отображает) объекты классов на записи в таблицах БД и наоборот, избавляя разработчика от написания большого объема рутинного SQL-кода.

Как это работает на практике? Вы работаете с обычными классами C# (сущностями), а ORM-фреймворк (например, Entity Framework Core) под капотом генерирует SQL-запросы для операций CRUD (Create, Read, Update, Delete).

Пример с Entity Framework Core:

// 1. Определяем сущность (класс, который будет маппиться на таблицу)
public class Product
{
    public int Id { get; set; } // Первичный ключ (по соглашению)
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// 2. Определяем контекст базы данных
public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; } // DbSet представляет таблицу

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer("YourConnectionString");
}

// 3. Используем в коде
using var db = new AppDbContext();

// CREATE - Вставка (ORM сгенерирует INSERT)
var newProduct = new Product { Name = "Laptop", Price = 999.99m };
db.Products.Add(newProduct);
await db.SaveChangesAsync();

// READ - Запрос (ORM сгенерирует SELECT)
var expensiveProducts = await db.Products
    .Where(p => p.Price > 500)
    .ToListAsync();

// UPDATE - Обновление (ORM сгенерирует UPDATE)
var product = await db.Products.FindAsync(1);
product.Price = 899.99m;
await db.SaveChangesAsync();

// DELETE - Удаление (ORM сгенерирует DELETE)
db.Products.Remove(product);
await db.SaveChangesAsync();

Ключевые преимущества ORM:

  • Повышение производительности разработки: Не нужно писать шаблонный SQL для каждой операции.
  • Безопасность: Параметризованные запросы (используются по умолчанию) защищают от SQL-инъекций.
  • Переносимость: Абстракция от конкретной СУБД (в разумных пределах). Смена БД с SQL Server на PostgreSQL потребует минимум изменений в коде.
  • Удобство работы с данными: LINQ-запросы интегрированы в язык, строгая типизация, IntelliSense.

Потенциальные недостатки и решения:

  • Снижение производительности в сложных сценариях: Некорректно составленный LINQ может породить неэффективный SQL. Решение: Использовать профайлеры (например, SQL Server Profiler), оптимизировать запросы, в крайних случаях — использовать raw SQL через FromSqlRaw.
  • «Утечка абстракции»: Сложности с маппингом нестандарчных типов или сложных связей. Решение: Глубокое изучение возможностей конкретного ORM, использование Fluent API для тонкой настройки.

Популярные ORM: Для .NET — Entity Framework Core, Dapper (микро-ORM); для Java — Hibernate; для Python — SQLAlchemy, Django ORM.