Экземпляр ChangeTracker
StateChanged и Tracked. Событие StateChanged инициируется в случае изменения состояния сущности. Оно не генерируется при отслеживании сущности в первый раз. Событие Tracked инициируется, когда сущность начинает отслеживаться, либо за счет добавления экземпляра DbSet в коде, либо при возвращении из запроса.Сброс состояния DbContext
В версии EF Core 5 появилась возможность сброса состояния DbContext
ChangeTracker.Clear() отсоединяет все сущности от свойств DbSet, устанавливая их состояние в Detached.Сущности
Строго типизированные классы, которые сопоставляются с таблицами базы данных, официально именуются
Подобная слабая связанность между базой данных и вашими сущностями означает возможность придания сущностям формы, соответствующей предметной области, независимо от проектного решения и структуры базы данных. Например, возьмем простую таблицу Inventory
AutoLot и сущностный класс Car из предыдущей главы. Имена отличаются, но сущность Car сопоставляется с таблицей Inventory. Исполняющая среда EF Core исследует конфигурацию сущностей в модели, чтобы отобразить клиентское представление таблицы Inventory (класс Car в примере) на корректные столбцы таблицы Inventory.В последующих разделах будет показано, каким образом соглашения EF Core, аннотации данных и код (использующий Fluent API) сопоставляют сущности, свойства и отношения между сущностями в модели с таблицами, столбцами и отношениями внешних ключей в базе данных.
Сопоставление свойств со столбцами
При работе с реляционным хранилищем данных по соглашениям EF Core все открытые свойства, допускающие чтение и запись, сопоставляются со столбцами таблицы, на которую отображается сущность. Если свойство является автоматическим, то EF Core читает и записывает через методы получения и установки. Если свойство имеет поддерживающее поле, тогда EF Core будет читать и записывать не в открытое свойство, а в поддерживающее поле, хотя оно и закрыто. Несмотря на то что EF Core может читать и записывать в закрытые поля, все же должно быть предусмотрено открытое свойство, предназначенное для чтения и записи, которое инкапсулирует поддерживающее поле.
Наличие поддерживающих полей предпочтительнее в двух сценариях: при использовании шаблона INotifyPropertyChanged
Имена, типы данных и допустимость значений null
Сопоставление классов с таблицами
В EF Core доступны две схемы сопоставления классов с таблицами: "таблица на иерархию" (table-per-hierarchy — ТРН) и "таблица на тип" (table-per-type — ТРТ). Сопоставление ТРН используется по умолчанию и отображает иерархию наследования на единственную таблицу. Появившееся в версии EF Core 5 сопоставление ТРТ отображает каждый класс в иерархии на собственную таблицу.
На заметку!
Классы также можно отображать на представления и низкоуровневые запросы SQL. Они называются типами запросов и обсуждаются позже в главе.Сопоставление "таблица на иерархию" (ТРН)
Рассмотрим приведенный ниже пример, в котором класс Car
Id и TimeStamp и собственно класс Car с остальными свойствами. Оба класса должны быть созданы в папке Models проекта AutoLot.Samples:using System.Collections.Generic;
namespace AutoLot.Samples.Models
{
public abstract class BaseEntity
{
public int Id { get; set; }
public byte[] TimeStamp { get; set; }
}
}