Есть ли опыт в EF?

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

Ответ

Да, есть коммерческий опыт работы с Entity Framework Core в production-проектах. Основные направления работы и best practices:

1. Подход Code-First и миграции:

  • Создание моделей (сущностей) и контекста, управление схемой БД через миграции.
    // Генерация миграции и обновление БД
    dotnet ef migrations add AddProductTable
    dotnet ef database update

2. Производительность и оптимизация запросов:

  • Использование AsNoTracking() для read-only сценариев.
  • Явная загрузка связанных данных (Include, ThenInclude) для решения проблемы N+1.
  • Проекции (Select) для выборки только нужных полей.
    var orders = await context.Orders
       .Where(o => o.Date > DateTime.UtcNow.AddDays(-7))
       .Select(o => new { o.Id, o.Total, CustomerName = o.Customer.Name })
       .AsNoTracking()
       .ToListAsync();

3. Настройка моделей через Fluent API:

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Product>()
           .HasKey(p => p.Id);
           .Property(p => p.Name)
               .IsRequired()
               .HasMaxLength(100);
           .HasIndex(p => p.CategoryId);
   }

4. Работа с сырыми SQL и хранимыми процедурами:

   var products = context.Products
       .FromSqlRaw("EXEC GetActiveProducts @MinPrice",
           new SqlParameter("@MinPrice", 10.0))
       .ToList();

5. Стратегии работы с контекстом:

  • Использование Dependency Injection для регистрации контекста с областью действия (Scoped).
  • Понимание жизненного цикла контекста для избежания проблем с кэшированием и утечками памяти.

6. Решение сложных сценариев:

  • Обработка конкурентного доступа (Concurrency Tokens).
  • Отложенная загрузка (Lazy Loading) и её подводные камни.
  • Сложные типы (Owned Entities) и иерархии наследования (TPH, TPT).

Опыт включает развёртывание и поддержку приложений с EF Core на различных СУБД: SQL Server, PostgreSQL и SQLite.