Как называется класс модели, который напрямую сопоставляется с таблицей базы данных в Entity Framework?

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

Ответ

Такой класс называется Сущность (Entity). В контексте Entity Framework Core (EF Core) сущность — это обычный класс CLR (POCO - Plain Old CLR Object), экземпляры которого отслеживаются контекстом данных (DbContext) и могут быть сохранены в базе данных.

Ключевые характеристики сущности:

  • Сопоставление с таблицей: Каждый класс-сущность обычно соответствует одной таблице в БД. Сопоставление настраивается через DbSet<T> в контексте, соглашения (conventions), атрибуты данных ([Table], [Column]) или Fluent API.
  • Свойства-столбцы: Открытые свойства с get/set обычно сопоставляются со столбцами таблицы.
  • Ключ: Должно быть свойство, помеченное как первичный ключ (по соглашению — свойство с именем Id или <ClassName>Id).
  • Навигационные свойства: Ссылки на другие сущности, определяющие связи (один-ко-многим, многие-ко-многим).

Пример сущности

// Класс-сущность, сопоставляемый с таблицей "Products"
public class Product
{
    // Свойство-первичный ключ. По соглашению станет столбцом Id с автоинкрементом.
    public int Id { get; set; }

    // Простые свойства, сопоставляемые со столбцами.
    public string Name { get; set; }
    public decimal Price { get; set; }
    public bool IsInStock { get; set; }

    // Внешний ключ (соглашение: <NavigationPropertyName>Id).
    public int CategoryId { get; set; }

    // Навигационное свойство для связи "многие к одному" с сущностью Category.
    public virtual Category Category { get; set; }

    // Навигационное свойство для связи "один ко многим" с сущностью OrderItem.
    public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
}

// Регистрация сущности в контексте данных
public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; } // DbSet представляет таблицу Products
    public DbSet<Category> Categories { get; set; }
    // ... другие DbSet
}

Отличие от других типов моделей

Важно не путать сущность с другими паттернами передачи данных:

  • DTO (Data Transfer Object): Простой контейнер для данных, передаваемых между слоями приложения (например, из API контроллера в клиент). Не содержит бизнес-логики и поведения, часто является плоским (без сложных графов объектов).
  • ViewModel: Класс, адаптированный для представления данных в UI (например, в MVC View или Razor Page). Может объединять данные из нескольких сущностей.
  • Модель предметной области (Domain Model): Более широкое понятие, которое включает сущности, их поведение (методы) и бизнес-правила. В чистом виде сущность EF Core — это, прежде всего, модель данных для персистентности, но она может также содержать и доменную логику.

Практический совет: Для сложных сценариев часто используют отдельные классы для сущности (персистентность) и для доменной логики, применяя паттерны вроде Repository и Mapping (например, с помощью AutoMapper) для преобразования между ними.