Работали ли вы с shadow properties (скрытыми свойствами) в Entity Framework?

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

Ответ

Да, работал. Shadow properties — это свойства, которые не определены в классе вашей модели, но существуют в модели EF Core и сопоставлены со столбцами базы данных.

Типичные сценарии использования:

  • Аудит: Автоматическое отслеживание CreatedDate и ModifiedDate.
  • Мягкое удаление: Флаг IsDeleted.
  • Внешние ключи (FK): Для отношений, где навигационное свойство есть, но явное свойство FK в классе не требуется.

Пример настройки и использования:

// В DbContext.OnModelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property<DateTime>("LastUpdated") // Определяем shadow property
        .HasDefaultValueSql("GETUTCDATE()");

    modelBuilder.Entity<Blog>()
        .Property<bool>("IsDeleted");
}

// Как получить или установить значение shadow property
var blog = context.Blogs.First();
// Получаем значение
var lastUpdated = context.Entry(blog).Property<DateTime>("LastUpdated").CurrentValue;
// Устанавливаем значение
context.Entry(blog).Property<bool>("IsDeleted").CurrentValue = true;

Ключевые моменты:

  • Доступ к ним осуществляется через DbContext.Entry(entity).Property<T>("PropertyName").
  • Они могут использоваться в запросах LINQ через статический метод EF.Property.
  • Полезны для инфраструктурных данных, которые не должны быть частью публичного API доменной модели.