Как получить сущность из DbContext в Entity Framework Core?

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

Ответ

В Entity Framework Core доступ к сущностям осуществляется через свойства DbSet<T>, которые представляют коллекции, привязанные к таблицам базы данных. Основные методы и подходы:

1. Поиск по первичному ключу (Find) Ищет в отслеживаемом контексте, затем в БД. Эффективен для поиска по ключу.

// Ищет пользователя с указанным Id
var user = await context.Users.FindAsync(userId);

2. Получение одного элемента (First, Single)

  • FirstOrDefaultAsync — возвращает первый элемент, удовлетворяющий условию, или null.
  • SingleOrDefaultAsync — ожидает ровно один элемент; выбросит исключение, если элементов несколько.
    
    // Получить первого активного пользователя
    var activeUser = await context.Users
    .FirstOrDefaultAsync(u => u.IsActive);

// Получить пользователя по уникальному email var user = await context.Users .SingleOrDefaultAsync(u => u.Email == "test@example.com");


**3. Фильтрация и материализация (`Where`, `ToList`)**
Запросы LINQ используют отложенное выполнение. Для выполнения запроса к БД нужна материализация.
```csharp
// Получить всех администраторов
var admins = await context.Users
    .Where(u => u.Role == Role.Admin)
    .ToListAsync();

Ключевые практики:

  • Отслеживание (Tracking): По умолчанию запросы отслеживают изменения. Для операций только на чтение используйте AsNoTracking().
  • Асинхронность: Всегда предпочитайте асинхронные методы (...Async) для избежания блокировки потоков.
  • Проекции: Извлекайте только нужные поля с помощью Select для повышения производительности.
    var userNames = await context.Users
    .Where(u => u.IsActive)
    .Select(u => u.FullName)
    .ToListAsync();