Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Master Entity Framework:50 ключевых вопросов и ответов на собеседовании (2026 г.)

Готовиться к собеседованию по Entity Framework — значит предвидеть вопросы, раскрывающие реальные способности. Вопросы для собеседования по Entity Framework раскрывают мышление, осведомленность о производительности и то, как кандидаты воплощают концепции на практике.

Освоение Entity Framework открывает возможности для современной разработки:от платформ, управляемых данными, до облачных сервисов. Практическое воздействие развивает аналитические способности, усиливает техническую глубину и поддерживает команды. Руководители, занимающиеся подбором персонала, ценят практическое решение проблем, масштабируемый дизайн, наставничество для молодых специалистов и возможности роста для новых выпускников.

Читать дальше…

👉 Бесплатная загрузка PDF-файла:Вопросы и ответы для собеседования по Entity Framework

1) Что такое Entity Framework и почему он используется?

Entity Framework (EF) – это платформа Microsoft ORM (объектно-реляционное сопоставление) для .NET, которая упрощает взаимодействие с базой данных, позволяя разработчикам работать с данными как со строго типизированными объектами .NET, а не с необработанным SQL. . Эта абстракция позволяет разработчикам выполнять операции CRUD (создание, чтение, обновление, удаление) с использованием знакомых конструкций C#, а платформа автоматически преобразует эти операции в оптимизированные SQL-запросы. EF сокращает шаблонный код доступа к данным, улучшает удобство обслуживания и помогает обеспечить безопасность типов во время компиляции.

Например, вместо написания SQL вы можете использовать:

var customers = context.Customers.Where(c => c.IsActive).ToList();

EF преобразует этот запрос LINQ в SQL, выполняет его в базе данных и возвращает результаты в виде объектов.

2) Объясните разницу между подходами «Сначала код», «Сначала база данных» и «Сначала модель».

Entity Framework поддерживает три основных подхода к разработке:

Подход Когда использовать Что происходит Сначала код Новые проекты или проектирование на основе предметной области. Вы определяете классы сущностей. EF генерирует схему базы данных из кода.Сначала база данных Существующая база данныхEF генерирует классы сущностей и контекст из существующей схемы.Сначала модель Если вы предпочитаете визуальное проектирование, вы разрабатываете модель в визуальном конструкторе (Entity Designer), а EF генерирует и классы, и базу данных.

Каждый подход подходит для разных сценариев:Сначала код популярен в гибкой разработке, Database First предпочтительнее для устаревших баз данных и Model First подходит для случаев, когда важно визуальное моделирование.

3) Что такое DbContext и какую роль он играет в EF?

DbContext  — основной класс, управляющий сессией с базой данных , отслеживает изменения сущностей и координирует сохранение данных обратно в базу данных. Он представляет собой мост между вашим приложением C# и базой данных. Через DbContext вы определяете DbSet<TEntity> свойства, которые представляют коллекции сущностей и сопоставляются с таблицами в базе данных.

Пример:

public class AppDbContext : DbContext
{
 public DbSet<Product> Products { get; set; }
}

Здесь Products действует как коллекция для выполнения операций CRUD. EF использует этот контекст для отслеживания состояний объекта. и генерировать команды SQL в SaveChanges() .

4) Что такое миграции в Entity Framework и как они используются?

Миграции представляют собой механизм отслеживания и применения изменений схемы в базу данных с течением времени. По мере развития вашей модели миграции помогают поддерживать синхронизацию базы данных без изменения сценариев SQL вручную. Используя Code First, вы используете такие команды, как:

Add-Migration InitialCreate
Update-Database

При этом создаются классы миграции, которые определяют изменения схемы и применяют их к базе данных. Миграции позволяют контролировать версии схемы базы данных и облегчают совместную разработку.

5) Опишите отложенную загрузку, быструю загрузку и явную загрузку.

Эффективная загрузка связанных данных имеет решающее значение в EF. Вот сравнение:

Стратегия Когда оно запускается Типичное использование Отложенная загрузка Связанные данные загружаются при первом доступе. Используйте, когда связанные данные не всегда нужны.Жаркая загрузка. Связанные данные загружаются заранее через .Include() Используйте, когда знаете, что вам нужны связанные данные.Явная загрузка. Загружается вручную после запроса. Дает контроль над тем, когда именно загружаются связанные данные.

Например:

var orders = context.Orders.Include(o => o.Customer).ToList(); // Eager

Отложенная загрузка помогает сократить число первоначальных запросов, но может вызвать проблемы с запросами N+1. при неосторожном использовании.

6) Что такое отслеживание изменений в Entity Framework?

Отслеживание изменений – это внутренний механизм EF для отслеживания изменений состояния объекта. после выполнения запроса. Когда объект извлекается с помощью DbContext , оно отслеживается. Любые изменения его свойств отмечаются, и когда SaveChanges() вызывается, EF генерирует соответствующий SQL INSERT , UPDATE или DELETE заявления. Для сценариев только для чтения, где отслеживание не требуется, AsNoTracking() повышает производительность за счет отключения отслеживания изменений.

7) Как Entity Framework обрабатывает конфликты параллелизма?

Управление параллелизмом гарантирует, что несколько пользователей, обновляющих одни и те же данные, не будут непреднамеренно перезаписывать изменения друг друга. EF использует оптимистический параллелизм. по умолчанию. Распространенный подход предполагает добавление токена параллелизма. (например, RowVersion временная метка). EF проверяет этот токен во время SaveChanges() , и если она отличается от версии базы данных, DbUpdateConcurrencyException выбрасывается, что указывает на конфликт. Затем разработчики могут обработать это исключение, чтобы повторить попытку или устранить различия в данных.

8) Каковы свойства навигации в EF?

Свойства навигации определяют отношения между сущностями. Они позволяют EF перемещаться по ассоциациям. (например, один-ко-многим) без объединения вручную:

public class Order
{
 public int Id { get; set; }
 public Customer Customer { get; set; }
}

Здесь Customer — это свойство навигации, связывающее Order к связанному с ним Customer . EF использует эти свойства для построения связей и автоматического объединения во время запросов. Свойства навигации работают вместе с внешними ключами. моделировать отношения.

9) Какова цель AsNoTracking()?

AsNoTracking() отключает отслеживание изменений для запроса, что полезно для только для чтения операции, в которых вы не собираетесь обновлять полученные объекты. Это повышает производительность за счет уменьшения использования памяти и отслеживания накладных расходов. Это особенно полезно при получении больших наборов данных без их изменения.

10) Что такое скомпилированные запросы и когда их следует использовать?

Скомпилированные запросы — это метод оптимизации производительности. Когда выполняется запрос LINQ, EF обычно каждый раз переводит его в SQL. В скомпилированных запросах этот перевод выполняется один раз, а полученный делегат используется повторно, что снижает накладные расходы на часто выполняемые или сложные запросы. Используйте их при большом трафике. сценарии, в которых один и тот же запрос выполняется неоднократно с разными параметрами.

11) Что такое состояния сущностей в Entity Framework и как они влияют на SaveChanges()?

Entity Framework отслеживает состояние каждой сущности. чтобы определить, какую операцию с базой данных выполнить во время SaveChanges() . Основные состояния объекта:

Состояние Описание Операция запущена Добавлено Новый объект, который нужно вставитьINSERT Изменено Существующий объект обновленUPDATE Удален Объект помечен для удаленияDELETE Без изменений Изменения не обнаруженыНетОтсоединен Не отслеживается contextNone

Когда вы звоните SaveChanges() EF проверяет состояния объектов и выполняет соответствующие команды SQL. Например, новая сущность добавлена в DbSet. будет отмечено Добавлено. , в результате чего получается INSERT запрос.

Пример:

context.Entry(product).State = EntityState.Modified;
context.SaveChanges();

Это явно обновляет запись базы данных для объекта.

Понимание состояний обеспечивает лучший контроль над синхронизацией данных и производительностью.

12) Каковы преимущества и недостатки использования Entity Framework?

Entity Framework предоставляет значительные преимущества, но также и некоторые компромиссы, в зависимости от вашего варианта использования.

Преимущества Недостатки Упрощает доступ к данным через LINQ и объектные модели. Накладные расходы на производительность по сравнению с необработанным ADO.NET. Уменьшает стандартный код SQL. Сложные запросы могут генерировать неэффективный SQL. Поддерживает несколько поставщиков баз данных. Сложнее отлаживать сгенерированные операторы SQL. Строгая типизация, повышает безопасность во время компиляции. Возможны конфликты миграции в больших группах. Обеспечивает быстрое прототипирование с помощью Code First. Меньше контроля над точно настроенными запросами.

Для крупномасштабных систем, требующих максимальной производительности, разработчики по-прежнему могут смешивать необработанный SQL с EF. для оптимизации.

13) Как Entity Framework обрабатывает отношения (один-к-одному, один-ко-многим, многие-ко-многим)?

Entity Framework управляет отношениями с помощью свойств навигации. и ассоциации внешних ключей .

Типы отношений:

Тип отношений Описание Пример Индивидуальный Каждый экземпляр сущности имеет одну связанную сущность.UserUserProfile Один ко многим Одна сущность связана с несколькими другими.CustomerOrders Многие ко многим Несколько объектов связаны друг с другом.StudentCourse

Пример Один ко многим отношения:

public class Customer
{
 public int CustomerId { get; set; }
 public ICollection<Order> Orders { get; set; }
}

EF автоматически генерирует внешние ключи и обрабатывает правила каскадного удаления. в зависимости от конфигурации.

Вы также можете использовать Fluent API. для более явного сопоставления отношений.

14) В чем разница между LINQ to Entities и LINQ to SQL?

Функция LINQ для объектов LINQ to SQL Поддерживаемые базы данныхНесколько (SQL Server, Oracle, MySQL и т. д.)Только SQL ServerБазовая платформаEntity FrameworkADO.NETModelКонцептуальная модель сущностиТолько таблицы базы данныхСопоставлениеСложное сопоставление (наследование, ассоциации)Прямое сопоставление таблицБудущая поддержкаАктивно поддерживаетсяУстарело

LINQ для объектов является частью Entity Framework и более универсален, а LINQ to SQL ограничен SQL Server и более простыми вариантами использования.

Следовательно, LINQ to Entities рекомендуется для разработки на уровне предприятия.

15) В чем разница между ObjectContext и DbContext?

Функция Контекст объекта Контекст ПлатформаБолее ранние версии EFУпрощенный API в EF 4.1+СложностьБольше подробностейЛегкость и простотаПроизводительностьНемного быстрее, но сложнее в использованииУпрощено с минимальными накладными расходамиОтслеживание измененийНеобходима настройка вручнуюАвтоматическое отслеживаниеПредпочтительное использованиеУстаревшие системыСовременные проекты EF/EF Core

DbContext внутренне оборачивает ObjectContext но предоставляет более чистый и интуитивно понятный API. Большинство современных приложений .NET должны использовать DbContext. .

16) Объясните жизненный цикл сущности в Entity Framework.

Жизненный цикл объекта описывает его переходы состояний. от создания к сохранению:

  1. Создание – Объект создается в памяти (состояние:Отсоединен). ).
  2. Прикрепление – Добавлено в контекст через DbSet.Add(). (состояние:Добавлен) ).
  3. Модификация – Изменения обнаруживаются автоматически (состояние:Изменено). ).
  4. НастойчивостьSaveChanges() вызывается → выполняются команды SQL.
  5. Удаление – Объект помечен как Удаленный. и удален из базы данных.
  6. Понимание этого жизненного цикла помогает устранять проблемы с данными и оптимизировать управление контекстом EF.

    17) Для чего используется Fluent API в Entity Framework?

    Fluent API предоставляет программный способ настройки отношений, ограничений и сопоставлений модели, часто используемый в OnModelCreating() метод вашего DbContext .

    Он обеспечивает детальный контроль над конфигурациями, которые аннотации к данным не могу выразить.

    Пример:

    modelBuilder.Entity<Customer>()
     .HasMany(c => c.Orders)
     .WithOne(o => o.Customer)
     .HasForeignKey(o => o.CustomerId);
    

    Fluent API особенно эффективен для настройки составных ключей. , отношения «многие ко многим» и каскадные правила .

    18) Что такое аннотации к данным в Entity Framework?

    Аннотации к данным – это атрибуты. применяется непосредственно к классам или свойствам модели для определения поведения схемы. Они проще, чем Fluent API, но менее гибкие.

    Пример:

    public class Product
    {
     [Key]
     public int ProductId { get; set; }
     [Required]
     [StringLength(50)]
     public string Name { get; set; }
    }
    

    Аннотации определяют ключи, длину строк, обязательные поля и отношения. В сложных случаях разработчики обычно комбинируют Аннотации к данным. и Свободный API .

    19) В чем разница между отслеживаемыми и неотслеживаемыми объектами в EF Core?

    Тип Описание Сценарий использования Отслеживаемые объекты Контролируется DbContext для изменений. Поведение по умолчанию для обновлений. Неотслеживаемые объекты Не контролируется; получено с помощью .AsNoTracking() .Идеально подходит для операций только для чтения.

    Отслеживаемые объекты потребляют больше памяти, но позволяют EF автоматически обнаруживать изменения.

    Неотслеживаемые объекты повышают производительность. в сценариях с высоким уровнем чтения и низким уровнем обновлений.

    20) Как выполнять необработанные SQL-запросы в Entity Framework?

    Entity Framework позволяет выполнять необработанный SQL для пользовательских или критически важных запросов.

    var result = context.Products
     .FromSqlRaw("SELECT * FROM Products WHERE Price > 100")
     .ToList();
    

    Для команд, не являющихся запросами:

    context.Database.ExecuteSqlRaw("DELETE FROM Products WHERE Discontinued = 1");

    Используйте эту функцию осторожно, чтобы избежать инъекций SQL. и поддерживать гибкость, не зависящую от базы данных.

    21) В чем разница между Entity Framework и Entity Framework Core?

    Entity Framework (EF) и Entity Framework Core (EF Core) различаются архитектурой, возможностями и кроссплатформенной поддержкой.

    Функция Entity Framework 6 (EF6) Ядро Entity Framework Только платформа.NET FrameworkКроссплатформенная (.NET 5/6/7)АрхитектураНа основе ObjectContextЛегкий и модульныйПроизводительностьМедленнее в некоторых запросахОптимизированная генерация запросовПоддержка LINQЗрелая, но ограниченнаяУлучшенный перевод и асинхронностьПоставщики баз данныхSQL Server, OracleМножественные (MySQL, PostgreSQL, SQLite и т. д.)ФункцииЗрелые (например, отложенная загрузка)Современные (например, теневые) свойства, глобальные фильтры)

    EF Core — это современный, активно развивающийся версия и рекомендуемый выбор для новых проектов .NET из-за ее гибкости и производительности.

    22) Как транзакции работают в Entity Framework?

    Транзакции в Entity Framework обеспечивают целостность данных. когда несколько операций должны завершиться успешно или завершиться неудачей вместе. По умолчанию EF оборачивает SaveChanges(). внутри транзакции. Для ручного управления:

    using (var transaction = context.Database.BeginTransaction())
    {
     try
     {
     context.Customers.Add(new Customer());
     context.SaveChanges();
     context.Orders.Add(new Order());
     context.SaveChanges();
     transaction.Commit();
     }
     catch
     {
     transaction.Rollback();
     }
    }
    

    Это обеспечивает атомарность — в случае сбоя какой-либо команды все изменения откатываются.

    EF также интегрируется с System.Transactions. для поддержки распределенных транзакций.

    23) Объясните стратегии наследования TPH, TPT и TPC в Entity Framework.

    Entity Framework поддерживает три основные стратегии сопоставления наследования для моделирования иерархий классов.

    Стратегия Описание Пример Преимущества Недостатки TPH (таблица по иерархии) Все классы делят один стол; столбец дискриминатора идентифицирует тип. Часто встречается в EF Core. Простые и быстрые запросы. Таблица может стать большой и разреженной. TPT (таблица по типу) Each subclass has its own table.Each derived class maps separately.Normalized schema.Slower joins on large hierarchies.TPC (Table Per Concrete Class) Каждый класс имеет свою собственную таблицу с повторяющимися столбцами. Каждый объект отображается отдельно. Высокая производительность чтения. Избыточность данных.

    Большинство разработчиков предпочитают TPH. из-за его простоты, если только требования нормализации или производительности не требуют иного.

    24) Как вы осуществляете настройку производительности в Entity Framework?

    Чтобы оптимизировать производительность Entity Framework:

    1. Используйте AsNoTracking() для запросов только для чтения.
    2. Нетерпеливая нагрузка только необходимые связанные объекты с .Include() .
    3. Избегайте запросов N+1 используя проекции или Select() .
    4. Использовать скомпилированные запросы для часто выполняемых операций.
    5. Групповая вставка/обновление с AddRange() и SaveChanges() .
    6. Отключить автоматическое обнаружение изменений для массовых операций:context.Configuration.AutoDetectChangesEnabled = false;
    7. Использовать кеширование и нумерацию страниц для больших наборов данных.
    8. Хорошо настроенная реализация EF может приблизиться к производительности ADO.NET, сохраняя при этом производительность разработчика.

      25) Что такое теневое свойство в Entity Framework Core?

      теневое свойство существует в модели EF, но не в классе сущностей. Он поддерживается EF в системе отслеживания изменений и хранится в базе данных.

      Пример:

      modelBuilder.Entity<Order>()
       .Property<DateTime>("LastUpdated");
      

      Это позволяет EF хранить дополнительные метаданные (например, временные метки, информацию аудита) без изменения класса сущности.

      Вы можете получить доступ к теневым свойствам через:

      var value = context.Entry(order).Property("LastUpdated").CurrentValue;

      Теневые свойства идеально подходят для сценариев ведения журнала или аудита.

      26) Что такое преобразователи значений в EF Core?

      Преобразователи значений в EF Core позволяют преобразовывать значения свойств при чтении или записи в базу данных.

      Например, чтобы сохранить перечисление в виде строки:

      modelBuilder.Entity<Employee>()
       .Property(e => e.Status)
       .HasConversion(
       v => v.ToString(),
       v => (EmployeeStatus)Enum.Parse(typeof(EmployeeStatus), v));
      

      Это повышает гибкость для пользовательских типов данных, таких как enum. , bool или DateTimeOffset .

      Преобразователи значений также используются для шифрования, сжатия или маскировки. конфиденциальных данных.

      27) Что такое глобальные фильтры запросов и как они работают?

      Глобальные фильтры запросов позволяют автоматически применять условия ко всем запросам объекта.

      Это особенно полезно для обратимого удаления. или мультиарендность .

      Пример:

      modelBuilder.Entity<Employee>()
       .HasQueryFilter(e => !e.IsDeleted);
      

      Каждый запрос, выполняемый к Employee автоматически исключает обратимо удаленные записи, если не указано иное явно.

      Глобальные фильтры улучшают удобство обслуживания и безопасность данных.

      28) Как можно протестировать код Entity Framework с помощью модульных тестов?

      Чтобы выполнить модульное тестирование логики EF, не обращаясь к реальной базе данных, используйте базы данных в памяти. или насмешливо :

      • Вариант 1. Поставщик InMemory
        var options = new DbContextOptionsBuilder<AppDbContext>()
         .UseInMemoryDatabase("TestDb")
         .Options;
        
      • Вариант 2. Имитация DbContext
        Макет DbSet использование таких библиотек, как Moq для изолированного тестирования.

      Модульные тесты должны проверять:

      • Правильность запроса (через LINQ)
      • Согласованность данных после SaveChanges()
      • Логика репозитория

      Тестирование с помощью EF Core InMemory обеспечивает скорость и позволяет избежать зависимостей от SQL Server.

      29) Объясните шаблоны репозитория и единицы работы в EF.

      Эти два архитектурных шаблона помогают абстрактному доступу к данным. и поддерживать согласованность транзакций .

      Шаблон Цель Пример реализации Репозиторий Инкапсулирует операции CRUD для каждого объекта.IRepository<T> интерфейс с Add() , GetAll() и т. д.Единица работы Координирует несколько репозиториев в рамках транзакции.SaveChanges() действует как граница фиксации.

      Пример:

      public class UnitOfWork : IUnitOfWork
      {
       private readonly AppDbContext _context;
       public void Commit() => _context.SaveChanges();
      }
      

      Эти шаблоны улучшают тестируемость. , повторное использование кода и разделение ответственности в крупных корпоративных приложениях.

      30) В чем разница между нетерпеливой загрузкой и проекционной загрузкой?

      Аспект Жаркая загрузка Загрузка проекции ЦельЗагрузка связанных данных заранееЗагрузка только определенных полей или свойствМетод.Include() .Select() Примерcontext.Orders.Include(o => o.Customer) context.Orders.Select(o => new { o.Id, o.Customer.Name }) ПроизводительностьВыбирает полные объектыВыбирает минимальные данныеИспользование случаяКогда для обработки необходимы связанные объектыКогда вам нужны конкретные облегченные данные

      Загрузка проекции – это оптимизация производительности. это уменьшает нагрузку на память за счет выбора только необходимых столбцов.

      31) Что такое перехватчики в Entity Framework Core?

      Перехватчики в EF Core позволяют разработчикам перехватывать и изменять операции с базой данных, такие как выполнение запросов, создание команд и открытие соединения. .

      Они действуют как компоненты промежуточного программного обеспечения между EF и поставщиком базы данных.

      Пример: Протоколирование всех выполненных команд SQL.

      public class CommandInterceptor : DbCommandInterceptor
      {
       public override void ReaderExecuting(
       DbCommand command,
       CommandEventData eventData,
       InterceptionResult<DbDataReader> result)
       {
       Console.WriteLine($"Executing SQL: {command.CommandText}");
       base.ReaderExecuting(command, eventData, result);
       }
      }
      

      Вы регистрируете его в DbContextOptionsBuilder. :

      optionsBuilder.AddInterceptors(new CommandInterceptor());

      Преимущества:

      • Расширенное ведение журнала
      • Безопасность (проверка запроса)
      • Аудит и отслеживание эффективности

      32) Как EF Core обрабатывает асинхронные операции?

      Entity Framework Core полностью поддерживает асинхронное программирование. с помощью таких методов, как SaveChangesAsync() , ToListAsync() и FirstOrDefaultAsync() .

      Асинхронное выполнение помогает улучшить масштабируемость. в веб-приложениях, освобождая потоки во время ожидания операций с базой данных, связанных с вводом-выводом.

      Пример:

      var customers = await context.Customers
       .Where(c => c.IsActive)
       .ToListAsync();
      

      Асинхронные операции особенно эффективны в высокопроизводительных API ASP.NET Core. и микросервисы, позволяющие сократить количество блокировок вызовов и сократить время ответа.

      33) Что такое устойчивость соединения в Entity Framework Core?

      Устойчивость соединения помогает вашему приложению автоматически восстанавливаться после временных сбоев базы данных , например сбои в сети или тайм-ауты SQL.

      Его можно настроить следующим образом:

      optionsBuilder.UseSqlServer(
       connectionString,
       options => options.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null)
      );
      

      Здесь EF будет повторять неудачные операции до 5 раз с задержками.

      Это особенно полезно в облачных средах. например, Azure SQL, где часто возникают временные сбои.

      34) Каковы типы принадлежащих собственности объектов в EF Core?

      Собственные сущности позволяют моделировать объекты значений. которые полностью зависят от жизненного цикла другой сущности.

      Они используют ту же таблицу, что и их владелец, и не могут существовать независимо.

      Пример:

      public class Address
      {
       public string Street { get; set; }
       public string City { get; set; }
      }
      public class Customer
      {
       public int Id { get; set; }
       public Address Address { get; set; }
      }
      

      Конфигурация:

      modelBuilder.Entity<Customer>().OwnsOne(c => c.Address);

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

      Концепции моделирования, такие как Адрес. , Деньги или Измерение которые не имеют собственной личности.

      35) Как реализовать обратимое удаление в Entity Framework Core?

      При мягком удалении записи помечаются как удаленные, а не удаляются физически.

      Они реализуются с использованием логического флага. и глобальные фильтры запросов .

      modelBuilder.Entity<Employee>()
       .HasQueryFilter(e => !e.IsDeleted);
      

      В операции удаления:

      employee.IsDeleted = true;
      context.Update(employee);
      context.SaveChanges();
      

      Преимущества:

      • Сохранение исторических данных
      • Легкое восстановление.

      Недостатки:

      • Большие таблицы базы данных
      • Требуется тщательная логика фильтрации.

      36) Что такое скомпилированная модель в EF Core и почему она используется?

      В EF Core 6+ скомпилированные модели разрешить предварительную компиляцию метаданных модели EF в сборку .NET, сокращая время запуска и накладные расходы во время выполнения.

      Шаги:

      1. Выполните команду:dotnet ef dbcontext optimize
      2. EF создает предварительно скомпилированный файл модели, который приложение загружает быстрее во время выполнения.
      3. Преимущество: Уменьшает задержку инициализации на 30–40 %, особенно в больших приложениях со множеством сущностей.

        Пример использования: Высокопроизводительные микросервисы и бессерверные среды.

        37) Как реализовать кеширование в Entity Framework?

        Кэширование помогает уменьшить количество повторяющихся запросов к базе данных. Существует два основных уровня:

        Тип Описание Пример Кэш первого уровня Встроенный, согласно DbContext экземплярУправляемый автоматическиКэш второго уровня External cache shared across contextsUse libraries like EFCoreSecondLevelCacheInterceptor

        Пример кэширования второго уровня:

        services.AddEFSecondLevelCache(options =>
        {
         options.UseMemoryCacheProvider().DisableLogging(false);
        });
        

        Это значительно повышает производительность в приложениях с большим объемом чтения. избегая избыточных обращений к базе данных.

        38) Как EF Core управляет токенами параллелизма и метками времени?

        Токены параллелизма предотвращают конфликтующие обновления. в многопользовательской среде.

        Вы можете пометить свойство как токен параллелизма, используя [ConcurrencyCheck]. или [Timestamp] атрибут.

        Пример:

        public class Product
        {
         public int Id { get; set; }
         [Timestamp]
         public byte[] RowVersion { get; set; }
        }
        

        Когда происходит обновление, EF включает этот столбец в WHERE. пункт.

        Если значение не соответствует, DbUpdateConcurrencyException выбрасывается — обеспечивая оптимистическое управление параллелизмом .

        39) Как реализовать аудит (отслеживание созданных, измененных и удаленных объектов) в EF Core?

        Аудит отслеживает метаданные, например кто создал, изменил или удалил. записи.

        Вы можете переопределить SaveChanges() :

        public override int SaveChanges()
        {
         var entries = ChangeTracker.Entries()
         .Where(e => e.Entity is IAuditable && 
         (e.State == EntityState.Added || e.State == EntityState.Modified));
         foreach (var entry in entries)
         {
         var auditable = (IAuditable)entry.Entity;
         auditable.LastModified = DateTime.UtcNow;
         }
         return base.SaveChanges();
        }
        

        Интерфейс:

        public interface IAuditable
        {
         DateTime Created { get; set; }
         DateTime LastModified { get; set; }
        }
        

        Этот метод централизует логику аудита, обеспечивая согласованное управление данными. .

        40) Каковы наилучшие методы использования Entity Framework в корпоративных приложениях?

        Категория Рекомендации Преимущество Производительность Используйте AsNoTracking() и прогнозы для запросов только для чтения. Снижает накладные расходы. Дизайн Внедрение шаблонов репозитория и единицы работы. Улучшает удобство обслуживания. Безопасность. Используйте параметризованные запросы, чтобы избежать SQL-инъекций. Защита данных.Масштабируемость. Используйте пул соединений и асинхронные методы. Выдерживает высокую нагрузку.Миграции. Используйте автоматическую миграцию с контролем версий. Упрощает управление схемой.Конфигурация Экстернализация строк подключения и секретов. Улучшенная изоляция среды. Тестирование. Используйте поставщик InMemory для модульных тестов. Более быстрое выполнение тестов.Журналирование Включите ведение журнала EF для получения информации о производительности. Упрощенная отладка.

        Эти методы обеспечивают надежность, масштабируемость и удобство обслуживания. приложения, созданные на основе Entity Framework.

        41) Как оптимизировать запросы LINQ для лучшего перевода SQL в Entity Framework?

        Entity Framework автоматически преобразует запросы LINQ в SQL, но неэффективные шаблоны могут привести к медленному или избыточному SQL. Оптимизация LINQ гарантирует, что ORM генерирует эффективные запросы к базе данных.

        Методы оптимизации:

        Используйте прогнозы:

        1. Выбирайте только необходимые столбцы, а не целые объекты.
        2. var customers = context.Customers
           .Select(c => new { c.Id, c.Name })
           .ToList();
          
          Избегайте оценки на стороне клиента:
          Всегда проверяйте, что фильтрация выполняется в SQL. , а не в памяти. EF Core предупреждает, когда оценка выполняется на стороне клиента.Используйте AsNoTracking() для данных только для чтения.
          var orders = context.Orders.AsNoTracking().ToList();
          Использование скомпилированных запросов для повторяющихся операций LINQ.Избегайте ненужного .Include() звонки — включайте связанные данные только при необходимости.

          Пример:

          Неэффективно:

          context.Customers.ToList().Where(c => c.IsActive);

          Эффективность:

          context.Customers.Where(c => c.IsActive).ToList();

          42) Каковы различные способы заполнения исходных данных в EF Core?

          Заполнение данных гарантирует, что в базе данных имеются данные по умолчанию или справочные данные. при создании.

          Подход 1. Использование ModelBuilder

          modelBuilder.Entity<Role>().HasData(
           new Role { Id = 1, Name = "Admin" },
           new Role { Id = 2, Name = "User" }
          );
          

          Это автоматически вставляет данные во время Update-Database .

          Подход 2. Пользовательский метод определения

          Выполнить код вручную при запуске:

          context.Database.Migrate();
          if (!context.Users.Any())
          {
           context.Users.Add(new User { Name = "Admin" });
           context.SaveChanges();
          }
          

          Подход 3. SQL-скрипты

          Используйте необработанный SQL при миграции:

          migrationBuilder.Sql("INSERT INTO Roles (Name) VALUES ('Admin')");

          Рекомендация:
          Используйте HasData() для статических справочных данных и программного заполнения для динамических данных запуска.

          43) Как EF Core управляет поставщиками баз данных внутри себя?

          EF Core независим от поставщика. , что означает, что он может работать с несколькими ядрами баз данных через отдельные пакеты поставщиков баз данных .

          Общие провайдеры:

          Поставщик Пакет NuGet База данных SQL-серверMicrosoft.EntityFrameworkCore.SqlServer MSSQLSQLiteMicrosoft.EntityFrameworkCore.Sqlite Мобильный/Настольный компьютерPostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL PostgreSQLMySQLPomelo.EntityFrameworkCore.MySql MySQLCosmos DBMicrosoft.EntityFrameworkCore.Cosmos NoSQL

          Внутри EF Core используются уровни абстракции. для:

          • Перевод запроса
          • Генерация команд SQL
          • Сопоставление типов данных

          Каждый поставщик реализует свои собственные классы, наследующие базовые абстракции EF Core (например, RelationalDatabaseProvider). , QuerySqlGenerator ).

          44) Что такое «сплит-запрос» и когда его следует использовать?

          Запросы разделения не позволяют EF выполнять большие и сложные соединения путем выполнения нескольких SQL-запросов вместо одного.

          Пример:

          var customers = context.Customers
           .Include(c => c.Orders)
           .AsSplitQuery()
           .ToList();
          

          При этом выполняется:

          1. Запрос 1 → Привлечение клиентов
          2. Запрос 2 → Получить заказы, связанные с этими клиентами.
          3. Преимущества:

            • Предотвращает получение больших декартовых произведений.
            • Повышает производительность при работе с большими связанными наборами данных.

            Недостаток:

            Несколько обращений к базе данных.

            Используйте разделенные запросы при быстрой загрузке больших связанных данных, которые могут вызвать проблемы с памятью.

            45) Как можно эффективно отслеживать команды SQL, сгенерированные EF?

            Мониторинг SQL помогает отлаживать медленные запросы и оптимизировать поведение ORM.

            Методы регистрации SQL:

            1. Журналирование консоли
            2. optionsBuilder
               .UseSqlServer(conn)
               .LogTo(Console.WriteLine, LogLevel.Information);
              
              Интеграция ILoggerFactory
              var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
              optionsBuilder.UseLoggerFactory(loggerFactory);
              
              Перехватчики Внедрить DbCommandInterceptor для захвата команд и времени.Инструменты профилирования Используйте такие инструменты, как:
              • Минипрофилер
              • Профилировщик SQL-сервера
              • EFCorePowerTools

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

              46) В чем разница между ChangeTracker.DetectChanges() и AutoDetectChangesEnabled?

              Функция DetectChanges() AutoDetectChangesEnabled TypeMethodPropertyPurposeЗаставляет EF сканировать отслеживаемые объекты и обнаруживать изменения. Включает или отключает автоматическое обнаружение изменений. DefaultManualTrueUsage. Явно вызывать оптимизацию производительности. Отключить для массовых обновлений.

              Пример:

              context.ChangeTracker.AutoDetectChangesEnabled = false;
              foreach (var item in list)
              {
               context.Add(item);
              }
              context.SaveChanges();
              

              Отключение автоматического обнаружения в циклах повышает производительность до 40 %. в массовых операциях.

              47) Как вы используете темпоральные таблицы с EF Core?

              Темпоральные таблицы (представленные в SQL Server 2016) позволяют отслеживать исторические данные. автоматически.

              Шаги:

              1. Включить временную поддержку при миграции:
              2. builder.Entity<Employee>()
                 .ToTable("Employees", b => b.IsTemporal());
                
                Запрос исторических данных:
                var history = context.Employees
                 .TemporalAsOf(DateTime.UtcNow.AddDays(-7))
                 .ToList();
                

                Преимущества:

                • Встроенное отслеживание истории данных.
                • Аудит и соблюдение требований
                • Ручные триггеры не требуются.

                EF Core 6+ поддерживает полные временные запросы.

                48) Как EF Core поддерживает совместное использование скомпилированных запросов и предварительно созданных моделей?

                Скомпилированные запросы и скомпилированные модели – это две функции повышения производительности. которые дополняют друг друга.

                Функция Цель Скомпилированные запросыКэшируйте результаты перевода запросаСкомпилированные моделиПредварительная компиляция метаданных модели

                Пример скомпилированного запроса:

                static readonly Func<AppDbContext, int, Customer> _getCustomerById =
                 EF.CompileQuery((AppDbContext ctx, int id) =>
                 ctx.Customers.FirstOrDefault(c => c.Id == id));
                

                Использование:

                var customer = _getCustomerById(context, 5);

                Вместе: Скомпилированные модели сокращают начальные затраты. , а скомпилированные запросы сокращают накладные расходы на запросы во время выполнения — идеально подходит для высокочастотных запросов .

                49) What are common pitfalls when using EF in microservices architecture?

                Common Mistakes:

                1. Shared DbContext Across Services
                  → Violates microservice isolation.
                  → Each microservice should have its own DbContext and schema.
                2. Chatty Communication (N+1 Queries)
                  → Minimize EF queries per API call.
                3. Excessive Eager Loading
                  → Load only what is required via DTOs.
                4. Centralized Migrations
                  → Each service should manage its own migrations independently.
                5. Lack of Transactional Boundaries
                  → Use distributed transactions (Outbox pattern) if cross-service consistency is required.
                6. Tight Coupling to SQL Provider
                  → Use repository abstraction to keep flexibility in database choice.
                7. 50) How does dependency injection integrate with DbContext in ASP.NET Core?

                  Entity Framework integrates seamlessly with ASP.NET Core’s built-in Dependency Injection (DI) system.

                  Setup:

                  services.AddDbContext<AppDbContext>(options =>
                   options.UseSqlServer(Configuration.GetConnectionString("Default")));
                  

                  Then inject it into controllers or services:

                  public class CustomerService
                  {
                   private readonly AppDbContext _context;
                   public CustomerService(AppDbContext context)
                   {
                   _context = context;
                   }
                  }
                  

                  Lifetimes:

                  Lifetime Description Recommended For ScopedOne context per HTTP requestDefaultTransientNew instance every timeBackground jobsSingletonShared globallyAvoid (not thread-safe)

                  Using DI ensures testability, lifecycle management , and resource efficiency across web and background processes.

                  🔍 Top Entity Framework Interview Questions with Real-World Scenarios &Strategic Responses

                  1) What is Entity Framework, and why is it used in enterprise applications?

                  Expected from candidate: The interviewer wants to assess your foundational understanding of Entity Framework and its value in real-world applications.

                  Example answer: Entity Framework is an Object-Relational Mapping framework for .NET that allows developers to work with databases using .NET objects instead of raw SQL. It is used in enterprise applications to improve productivity, reduce boilerplate data access code, and maintain a strong separation of concerns.

                  2) Can you explain the difference between Code First, Database First, and Model First approaches?

                  Expected from candidate: The interviewer wants to evaluate your knowledge of different development workflows and when to use each one.

                  Example answer: Code First starts with domain classes and generates the database from code. Database First begins with an existing database and generates entity classes. Model First uses a visual designer to define the model and then creates both code and database. Each approach is chosen based on project requirements and existing infrastructure.

                  3) How does Entity Framework handle relationships between tables?

                  Expected from candidate: The interviewer is checking your understanding of data modeling and relational mapping.

                  Example answer: Entity Framework handles relationships using navigation properties and foreign keys. It supports one-to-one, one-to-many, and many-to-many relationships, allowing developers to traverse related data using object references rather than joins.

                  4) Describe a situation where you improved database performance using Entity Framework.

                  Expected from candidate: The interviewer wants to hear a practical example demonstrating optimization skills.

                  Example answer: In my previous role, I improved performance by reducing unnecessary eager loading and implementing projection queries with Select statements. This minimized the amount of data retrieved from the database and significantly reduced query execution time.

                  5) How do you manage migrations in Entity Framework?

                  Expected from candidate: The interviewer is assessing your experience with schema changes and version control.

                  Example answer: Migrations are managed using the built-in migration tools that track model changes over time. At a previous position, I regularly generated and reviewed migration scripts before applying them to ensure database integrity across environments.

                  6) What is lazy loading, and when would you avoid using it?

                  Expected from candidate: The interviewer wants to test your understanding of data loading strategies and performance trade-offs.

                  Example answer: Lazy loading automatically loads related data when it is accessed. I would avoid using it in performance-critical scenarios or APIs because it can cause multiple unintended database calls, leading to the N+1 query problem.

                  7) How do you handle transactions in Entity Framework?

                  Expected from candidate: The interviewer is evaluating your knowledge of data consistency and error handling.

                  Example answer: Entity Framework supports transactions through the DbContext and TransactionScope. At my previous job, I used explicit transactions to ensure that multiple related database operations either completed successfully together or were rolled back in case of failure.

                  8) Explain how dependency injection is used with Entity Framework.

                  Expected from candidate: The interviewer wants to see how well you understand modern application architecture.

                  Example answer: Dependency injection is used to inject the DbContext into services or controllers. This improves testability and maintainability by allowing the context to be mocked or replaced without changing business logic.

                  9) Describe a challenging bug you encountered with Entity Framework and how you resolved it.

                  Expected from candidate: The interviewer is looking for problem-solving ability and debugging skills.

                  Example answer: In my last role, I encountered an issue with tracking conflicts when updating detached entities. I resolved it by explicitly setting entity states and ensuring that only one instance of each entity was tracked by the context.

                  10) How do you decide when Entity Framework is not the right tool?

                  Expected from candidate: The interviewer wants to understand your judgment and ability to choose appropriate technologies.

                  Example answer: I consider alternatives when applications require extremely high-performance data access or complex stored procedure logic. In such cases, using a micro-ORM or raw ADO.NET can provide more control and efficiency.


Язык C

  1. Программа Hello World на C++ с объяснением кода
  2. Функции в программировании на C с примерами:рекурсивные и встроенные
  3. C — Препроцессоры
  4. Учебник по C# ArrayList с примерами
  5. Освоение указателей на константы и указателей на константы в C
  6. Операторы С#
  7. Обзор С++
  8. Освоение динамической инициализации с помощью конструкторов в C++
  9. C — Классы хранения
  10. С - Операторы