Что такое Entity Framework?

Ответ

Entity Framework (EF) — это объектно-реляционный маппер (ORM) с открытым исходным кодом от Microsoft для платформы .NET. Он позволяет разработчикам работать с реляционной базой данных, используя объекты .NET, и минимизирует необходимость в написании низкоуровневого SQL-кода.

Основные концепции и возможности:

  • DbContext: Центральный класс, представляющий сессию работы с БД. Отслеживает изменения объектов, выполняет запросы и сохраняет данные.
  • DbSet: Представляет коллекцию сущностей (таблицу) в контексте.
  • LINQ to Entities: Позволяет писать строго типизированные запросы к БД на языке C#.
  • Трекинг изменений: EF автоматически отслеживает изменения в извлечённых объектах и генерирует соответствующие команды INSERT, UPDATE, DELETE при вызове SaveChanges().
  • Миграции: Механизм для инкрементального обновления схемы БД в соответствии с изменениями в моделях (Code First).
  • Поставщики данных: Поддержка SQL Server, PostgreSQL, SQLite, MySQL, Cosmos DB и других.

Пример (Code First подход):

// 1. Определяем модель (сущность)
public class Blog
{
    public int Id { get; set; } // Первичный ключ
    public string Url { get; set; }
    public List<Post> Posts { get; set; } // Навигационное свойство
}

// 2. Создаём контекст
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; } // DbSet для таблицы Blogs
    public DbSet<Post> Posts { get; set; }
}

// 3. Используем
using (var db = new BloggingContext())
{
    // Запрос через LINQ
    var blogs = await db.Blogs
                        .Where(b => b.Url.Contains("tech"))
                        .Include(b => b.Posts) // Жадная загрузка связанных данных
                        .ToListAsync();

    // Добавление новой записи
    db.Blogs.Add(new Blog { Url = "http://example.com" });
    await db.SaveChangesAsync();
}

Подходы к разработке:

  1. Code First: Создание классов сущностей и генерация схемы БД из кода (рекомендуемый современный подход).
  2. Database First: Генерация классов сущностей и контекста из существующей базы данных.
  3. Model First (устарел): Проектирование модели в дизайнере EDMX и генерация кода и БД.

Ответ 18+ 🔞

Так, Entity Framework, ну, это такая штука от Microsoft, которая делает вид, что база данных — это просто набор твоих родных C# классов. Вместо того чтобы пиздеться с SQL вручную, ты пишешь на LINQ, а она уже сама соображает, как это в SELECT * FROM превратить. Удобно, конечно, но иногда такую дичь сгенерирует, что волосы дыбом встают.

Основные фишки, которые надо знать:

  • DbContext: Это типа главный управляющий, который за всем следит. Он знает, что ты там достал из базы, что поменял, и когда ты скажешь "сохрани всё" — он сам разберётся, что добавить, обновить или удалить.
  • DbSet: Представь, что это твоя личная коллекция объектов, которая на самом деле — таблица в базе. Хочешь с ней работать — бери DbSet из контекста.
  • LINQ to Entities: Вот это вообще магия. Ты пишешь запрос на C#, почти как обычную фильтрацию списка, а EF его переводит на SQL. Главное — не выстрелить себе в ногу сложными запросами, а то она может сгенерировать какую-нибудь неоптимизированную хуйню.
  • Трекинг изменений: EF, как назойливый младший брат, следит за каждым твоим объектом. Изменил свойство — он это запомнил. Вызвал SaveChanges() — он побежал всё это в базу пихать. Иногда это охуенно, а иногда хочется его отключить, чтобы не мешался.
  • Миграции (Code First): Ты меняешь свой класс — добавляешь поле, например. EF умеет генерировать скрипты, чтобы подогнать под тебя схему базы. Это мощно, но если накосячить, можно такую кашу заварить, что потом полдня разгребать.
  • Поставщики данных: Работает с кучей баз: SQL Server, PostgreSQL, SQLite... В общем, с теми, кто не совсем древний.

Вот как это выглядит в коде (самый популярный подход — Code First):

// 1. Описываешь свою сущность. Просто класс, блядь.
public class Blog
{
    public int Id { get; set; } // Это по умолчанию будет первичным ключом
    public string Url { get; set; }
    public List<Post> Posts { get; set; } // А это связь с другими записями
}

// 2. Создаёшь контекст — свою главную точку входа в базу.
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; } // Говоришь ему: "Вот это вот — таблица Blogs"
    public DbSet<Post> Posts { get; set; }
}

// 3. Используешь.
using (var db = new BloggingContext())
{
    // Запрос через LINQ. Читается почти как по-русски.
    var blogs = await db.Blogs
                        .Where(b => b.Url.Contains("tech")) // Где в урле есть "tech"
                        .Include(b => b.Posts) // И сразу подтяни связанные посты, чтобы потом не дёргать базу сто раз
                        .ToListAsync(); // И дай мне это всё списком

    // Добавить новую запись? Легко.
    db.Blogs.Add(new Blog { Url = "http://example.com" });
    await db.SaveChangesAsync(); // И всё, пошло на сохранение.
}

Какие вообще бывают подходы:

  1. Code First (Сейчас все так делают): Ты с нуля пишешь классы на C#, а EF по ним строит или обновляет базу данных. Как по мне — самый адекватный путь.
  2. Database First (Когда досталась старая база): База уже есть, как чёрный ящик. Ты говоришь EF: "Слушай, глянь на эту схему и сгенерируй мне под неё классы". Удобно для легаси, но потом с этими классами жить.
  3. Model First (Забей, это старьё): Был такой дизайнер в студии, где ты мышкой рисовал схемку. Потом из неё генерировался и код, и база. Сейчас это уже почти археология, ёпта.