Ответ
Такой класс называется Сущность (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) для преобразования между ними.
Ответ 18+ 🔞
Давай разжую эту тему, как будто объясняю за соседним столом в общаге, пока чайник кипит.
Смотри, есть у тебя обычный класс, так, ничем не примечательный. Ну, свойства, поля — хуйня. Это и есть Сущность (Entity). По сути, это просто твой POCO-класс, который EF Core хватает за жопу и тащит в базу данных, как будто это его законная собственность.
Что с ней делает EF Core, этот хитрожопый фреймворк? Он её отслеживает. Создал ты объект, добавил в контекст — он за ним глаз да глаз. Изменил свойство — EF Core это заметит и при сохранении в базу всё аккуратно обновит. Это не какой-то там DTO, который послали и забыли. Сущность — она под колпаком.
Как она в базе оказывается? Обычно один такой класс — это одна таблица в базе. Свойства — это столбцы. Всё это можно настроить: либо по умолчанию (EF Core многое сам догадается), либо атрибутами, либо через Fluent API — это как удобнее.
Главное, без чего не жить:
- Ключ. Надо ему свойство, которое будет первичным ключом. Чаще всего это
IdилиProductId. Без этого — пиздец, EF Core начнёт нервно курить и спрашивать «а где, блядь, ключ?». - Навигационные свойства. Вот это магия. Через них ты описываешь связи между таблицами. Типа, у
ProductестьCategory. Это не простоint CategoryId, а ссылка на целый объект-категорию. Или коллекцияOrderItems. EF Core по этим ссылкам сам JOIN'ы строит и графы объектов подтягивает. Красота, хотя иногда и головная боль.
Вот смотри, пример, как это выглядит в коде:
// Это наш класс-сущность. Будет таблица "Products" в базе.
public class Product
{
// Ключ. EF Core увидит "Id" и поймёт всё сам. Автоинкремент, красота.
public int Id { get; set; }
// Простые свойства — станут столбцами.
public string Name { get; set; }
public decimal Price { get; set; }
public bool IsInStock { get; set; }
// Внешний ключ. По умолчанию ищет свойство с именем <НавигационноеСвойство>Id.
public int CategoryId { get; set; }
// Навигационное свойство. Связь "многие к одному". Виртуальное — для ленивой загрузки.
public virtual Category Category { get; set; }
// А это связь "один ко многим". Заказы, где этот товар фигурирует.
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
}
// А вот так мы эту сущность регистрируем в контексте — главной точке входа EF Core.
public class AppDbContext : DbContext
{
// DbSet — это и есть представление таблицы в коде.
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
// ... и так далее
}
Важный момент, чтобы не облажаться: Не путай сущность с другой хуйнёй, которую тоже называют «моделями».
- DTO (Data Transfer Object): Это как конверт для данных. Кинул туда-сюда, распаковал, выбросил. Никакого отслеживания, никакой сложной вложенности. Плоский и простой.
- ViewModel: Это уже для интерфейса. Туда можешь намешать всего: и из сущности
Productполя, и изCategoryназвание, и ещё какую-нибудь хуйню, нужную для отрисовки страницы. - Модель предметной области (Domain Model): Это более крутая версия сущности. Она не только данные хранит, но и поведение (методы) с бизнес-правилами внутри. Твоя EF Core-сущность может быть такой моделью, но часто это просто болванка для базы.
Совет из окопа: Если проект не игрушечный, то часто делают так: доменная модель (с мозгом) живёт отдельно, а для EF Core заводят туповатую сущность-копию, только для сохранения в базу. Потом между ними маппером (типа AutoMapper) данные перегоняют. Больше писанины, зато голова не болит от того, что требования базы и бизнес-логики лезут друг другу в пасть.