Что такое сущность в Entity Framework?

Ответ

В Entity Framework (EF) сущность (Entity) — это обычный класс CLR (POCO), который представляет бизнес-объект и напрямую сопоставляется с таблицей (или представлением) в базе данных. Каждый экземпляр сущности соответствует строке в этой таблице.

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

  • Идентичность: Имеет уникальный ключ (обычно свойство Id или составной ключ), который EF Core использует для отслеживания.
  • Отслеживание изменений: Экземпляры, извлеченные в контекст (DbContext), отслеживаются на предмет изменений для последующей генерации операторов INSERT, UPDATE, DELETE.
  • Связи: Может навигационными свойствами определять связи с другими сущностями (один-ко-многим, многие-ко-многим).

Пример базовой сущности:

public class Blog // Сущность, сопоставленная с таблицей "Blogs"
{
    // Свойство первичного ключа (по соглашению)
    public int Id { get; set; }

    // Простые свойства (сопоставляются со столбцами)
    public string Url { get; set; }
    public int Rating { get; set; }

    // Навигационное свойство (связь "один ко многим" с Post)
    public ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    // Свойство внешнего ключа и навигационное свойство
    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Отличие от DTO/ViewModel: Сущность содержит логику предметной области и состояние для сохранения, в то время как DTO — это простой контейнер для передачи данных, не привязанный к контексту EF.

Ответ 18+ 🔞

Давай разжую тебе про сущности в Entity Framework, чтобы понятно стало, как два пальца обоссать.

Представь, что у тебя есть база данных — этакая помойка с таблицами. А сущность в EF — это, по сути, твой личный переводчик с языка этой помойки на нормальный человеческий C#. Это обычный класс, который ты пишешь, но EF Core смотрит на него и такой: «А, понятно, это же таблица Blogs, сейчас я свяжу всё, как надо».

Что в этих сущностях такого особенного, спросишь ты? Да вот что:

  • Уникальная морда лица (Идентичность). У каждой сущности должен быть свой уникальный ключ, обычно это свойство Id. Без этого EF просто не поймёт, как отличать одну запись от другой. Это как твой паспорт в мире базы данных — без него ты никто, хуй с горы.
  • За тобой следят (Отслеживание изменений). Как только ты вытащил объект из базы через контекст (DbContext), EF начинает за тобой подглядывать. Изменил свойство? Он это заметил. Потом, когда скажешь SaveChanges(), он сам сгенерирует нужные команды UPDATE или INSERT. Удобно, аж жуть.
  • Друзья-приятели (Связи). Сущности могут ссылаться друг на друга через навигационные свойства. Один блог имеет много постов? Запросто. Прописываешь public ICollection<Post> Posts { get; set; } и живёшь, как сыр в масле катаешься. EF сам сообразит, как это связать через внешние ключи.

Вот смотри, как это выглядит в коде, простыми глазами:

public class Blog // Это будет таблица "Blogs", да
{
    // Вот он, главный идентификатор. Без него — нихуя не работает.
    public int Id { get; set; }

    // Простые поля — просто колонки в таблице.
    public string Url { get; set; }
    public int Rating { get; set; }

    // А это магия связей. Говорит: "У этого блога дохуя постов".
    public ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    // Внешний ключ на блог. Чистая техническая связь.
    public int BlogId { get; set; }
    // А это навигационное свойство. Через него можно от поста к блогу дотянуться.
    public Blog Blog { get; set; }
}

И главное, не путай это всё с DTO или ViewModel! Это, блядь, важно.

  • Сущность (Entity) — это полноправный гражданин твоего домена. Он знает бизнес-логику, его отслеживает EF, и он напрямую связан с таблицей в базе. Он жирный и состоятельный.
  • DTO/ViewModel — это просто курьер, мальчик на побегушках. Его задача — донести данные из точки А в точку Б. Никакой логики, никакого отслеживания. Выдал данные и сдох, в рот меня чих-пых. Используется, чтобы не светить свои жирные сущности куда не надо, например, в API или в представления.

Короче, сущность — это основа, скелет твоего приложения, который умеет разговаривать с базой. Сделаешь криво — всё развалится, и будешь потом ебаться с отладкой до посинения.