Свойства тени — это свойства, которые не определены в классе сущностей .NET, но определены для этого типа сущности в модели EF Core. Значения и состояния этих атрибутов поддерживаются исключительно в трекере изменений. Затеняемые свойства полезны, когда данные в базе данных не должны отображаться на типе отображаемой сущности. Ядро Entity Framework вводит новый тип атрибута, называемый атрибутом «тень», который отсутствует в EF 6.x.
Теневого атрибута нет. .NET классы сущностей. Вместо этого вы можете настроить его для конкретного типа сущности в модели данных сущности. Его можно настроить в методе OnModelCreating() контекстного класса.
Следующая диаграмма иллюстрирует атрибут тени.
Как показано на изображении выше, атрибут тени не относится к вашему классу сущности. Поэтому вы не можете получить доступ к нему при доступе к другим свойствам сущности. Затеняемые свойства можно настроить только для типов сущностей при построении модели данных сущности, и они также будут отображаться в столбцы базы данных. Стоимость и состояние теневой собственности сохраняются только в трекере изменений.
Давайте разберёмся с практическими аспектами теневых свойств. Допустим, нам нужно поддерживать даты создания и обновления каждой записи в таблице базы данных. Вы научились устанавливать даты создания и изменения для сущностей в EF Core, определяя свойства CreatedDate и UpdatedDate в классе сущности. Здесь мы посмотрим, как добиться того же результата, используя свойства тени вместо включения свойств тени в класс сущности.
Рассмотрим следующие курсы по студенческим сущностям.
Класс студентов вышеАтрибуты CreatedDate и UpdatedDate не включенысохранять время создания или обновления. Мы настраиваем их как теневые свойства на сущности Student.
Определите свойства тени
Вы можете использовать метод OnModelCreating() для определения теневых свойств типов сущностей с помощью Fluent API.
Следующая конфигурация настраивает два затеняемых свойства — CreatedDate и UpdatedDate — для сущности Student.
Как видно, метод Property() используется для настройки свойств теней. Укажите имя свойства тени в виде строки, а тип — как общий параметр. Если имя, указанное в методе Property(), совпадает с именем существующего свойства, EF Core настроит это свойство как теневое свойство вместо введения нового теневого свойства.
Теневые свойства в базе данных
После определения теневых свойств необходимо обновить схему базы данных, так как свойства теней будут отображаться в соответствующие столбцы базы данных.
Для этого добавьте миграцию базы данных в консоли Package Manager Visual Studio с помощью следующей команды.
Теперь таблица Student будет включать два столбца: CreatedDate и UpdatedDate в SQL Server, как показано ниже.
Так что даже если мы не включим эти свойства в класс Student и не настроим их как теневые свойства, база данных будет иметь соответствующие столбцы.
Доступ к теневой собственности
Вы можете использовать метод Property(), чтобы получить или установить значение теневого свойства в EntityEntry. Следующий код обращается к значению свойства тени.
Однако в нашем сценарии мы хотим автоматически устанавливать значения в эти теневые свойства в методе SaveChanges(), чтобы не пришлось вручную устанавливать их на каждом объекте сущности. Итак, переопределите метод SaveChanges() в контекстном классе, как показано ниже.
Это автоматически задаст значения для теневых свойств CreatedDate и UpdatedDate.
Теперь выполните следующий код и проверьте записи в базе данных.
Вышеуказанный код вставит следующие записи в CreatedDate и UpdatedDate для студентов.
Поэтому, настраивая свойства теней, нам не нужно включать их в класс сущности.
Настройте свойства тени на всех объектах
Вместо того чтобы вручную настраивать свойства теней для всех объектов одновременно, вы можете настраивать их вручную.
Например, мы можем настроить все сущности CreatedDate и UpdatedDate в прошлый раз, как показано на следующем изображении.
Когда использовать свойство тени?
Атрибут тени может использоваться в двух случаях:
Когда вы не хотите показывать столбцы базы данных на отображаемых объектах, как в описанном выше сценарии. Когда вы не хотите раскрывать атрибуты внешнего ключа, а хотите использовать только навигационные атрибуты для управления отношениями. Свойство внешнего ключа будет свойством тени и будет отображаться в столбце базы данных, но не будет отображаться как свойство объекта. (В EF Core, если вы не определите свойство внешнего ключа в классе сущности, оно автоматически генерирует свойство теневого для этого.) Вам не нужно вручную настраивать свойства внешних ключей. )
Ресурсы:
Вход по гиперссылке виден.
Вход по гиперссылке виден.
|