В чем разница между подходами Code First и Database First в Entity Framework?

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

Ответ

Code First — это подход разработки, при котором вы сначала пишете классы сущностей на C#, а Entity Framework автоматически создает или обновляет схему базы данных на основе этих классов. Database First — противоположный подход: вы начинаете с существующей базы данных, а EF генерирует соответствующие классы сущностей и контекст данных.

Основные различия

  • Направление: Code First — от кода к БД. Database First — от БД к коду.
  • Контроль: В Code First вы полностью контролируете модель через код. В Database First схема управляется в БД, а код является её отражением.
  • Миграции: Code First имеет встроенную систему миграций для эволюции схемы БД. В Database First для обновления модели обычно требуется обновить EDMX-диаграмму или повторно выполнить скаффолдинг.

Пример Code First

// 1. Определяем класс сущности
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public List<Post> Posts { get; set; }
}

// 2. Определяем контекст данных
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
}

// 3. EF создаст базу данных и таблицу 'Blogs' при первом обращении
using (var db = new BloggingContext())
{
    db.Blogs.Add(new Blog { Url = "http://example.com" });
    db.SaveChanges();
}

Пример Database First

Для существующей базы данных вы используете команду Scaffold-DbContext в Package Manager Console:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

Эта команда сгенерирует классы Blog и BloggingContext на основе таблиц в указанной базе данных.

Когда что использовать?

  • Code First: Идеален для новых проектов, где вы хотите использовать систему контроля версий для схемы данных (миграции) и предпочитаете работать преимущественно с кодом.
  • Database First: Подходит при работе со сложной, уже существующей базой данных или когда схема БД управляется отдельной командой администраторов.