Что такое Entity Framework Core?

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

Ответ

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

Ключевые возможности

  • LINQ-запросы: Пишите запросы на языке C#, EF Core транслирует их в SQL.
  • Отслеживание изменений (Change Tracking): Автоматически отслеживает изменения в загруженных сущностях и генерирует соответствующие SQL-команды при сохранении.
  • Миграции (Migrations): Позволяют управлять схемой базы данных как кодом, создавая инкрементальные скрипты обновления.
  • Поддержка различных СУБД: SQL Server, PostgreSQL, MySQL, SQLite, Oracle и другие через провайдеры.
  • Работа с транзакциями.
  • Жадная (Eager), явная (Explicit) и ленивая (Lazy) загрузка связанных данных.

Базовый пример работы

1. Определение модели и контекста данных:

public class Blog
{
    public int Id { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
    public List<Post> Posts { get; set; } // Навигационное свойство
}

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(@"Server=(localdb)mssqllocaldb;Database=BloggingDB;Trusted_Connection=True");
}

2. Использование (CRUD):

// Создание (Create)
using var db = new BloggingContext();
var blog = new Blog { Url = "https://example.com", Rating = 5 };
db.Blogs.Add(blog);
await db.SaveChangesAsync();

// Чтение (Read) с LINQ
var topBlogs = await db.Blogs
    .Where(b => b.Rating > 3)
    .OrderByDescending(b => b.Rating)
    .ToListAsync();

// Обновление (Update)
var blogToUpdate = await db.Blogs.FindAsync(1);
if (blogToUpdate != null)
{
    blogToUpdate.Rating = 10;
    await db.SaveChangesAsync(); // EF Core сгенерирует UPDATE
}

// Удаление (Delete)
var blogToDelete = await db.Blogs.FindAsync(2);
db.Blogs.Remove(blogToDelete);
await db.SaveChangesAsync(); // EF Core сгенерирует DELETE

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

Идеален для быстрой разработки приложений с богатой объектной моделью. Для высоконагруженных сценариев, требующих максимальной производительности и тонкого контроля над SQL, иногда предпочтительнее использовать микро-ORM (например, Dapper) или чистый SQL.