50 najlepszych pytań i odpowiedzi na rozmowach kwalifikacyjnych dotyczących Entity Framework (2026)

Najważniejsze pytania i odpowiedzi dotyczące Entity Framework podczas rozmów kwalifikacyjnych

Przygotowanie się do rozmowy kwalifikacyjnej z Entity Framework oznacza przewidywanie pytań, które ujawniają rzeczywiste umiejętności. Pytania z Entity Framework na rozmowie kwalifikacyjnej ujawniają myślenie, świadomość wydajności i to, jak kandydaci przekładają koncepcje na praktykę.

Mastering Entity Framework otwiera nowe możliwości w obszarze nowoczesnego rozwoju oprogramowania, od platform opartych na danych po usługi w chmurze. Praktyczne doświadczenie rozwija umiejętności analityczne, wzmacnia kompetencje techniczne i wspiera zespoły. Liderzy rekrutacji cenią praktyczne rozwiązywanie problemów, skalowalność projektów, mentoring młodszych pracowników i ścieżki rozwoju dla świeżo upieczonych absolwentów.
Czytaj więcej ...

👉 Bezpłatne pobieranie pliku PDF: Pytania i odpowiedzi na temat Entity Framework podczas rozmowy kwalifikacyjnej

Najważniejsze pytania i odpowiedzi dotyczące Entity Framework podczas rozmów kwalifikacyjnych

1) Czym jest Entity Framework i dlaczego się go używa?

Entity Framework (EF) to MicrosoftStruktura ORM (mapowanie obiektowo-relacyjne) dla platformy .NET, która upraszcza interakcję z bazą danych, umożliwiając programistom pracę z danymi jako silnie typizowanymi obiektami .NET zamiast surowego kodu SQLTa abstrakcja umożliwia programistom wykonywanie operacji CRUD (tworzenie, odczyt, aktualizacja, usuwanie) za pomocą znanych konstrukcji języka C#, a framework zajmuje się tłumaczeniem tych operacji na zoptymalizowane zapytania SQL. EF redukuje ilość szablonowego kodu dostępu do danych, poprawia łatwość obsługi i pomaga w egzekwowaniu bezpieczeństwa typów w czasie kompilacji.

Na przykład zamiast pisać SQL, możesz użyć:

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

EF przetłumaczy to zapytanie LINQ na język SQL, wykona je na bazie danych i zwróci wyniki jako obiekty.


2) Wyjaśnij różnicę pomiędzy podejściami Code First, Database First i Model First.

Entity Framework obsługuje trzy główne podejścia programistyczne:

Podejście Kiedy użyć Co się dzieje
Najpierw kod Nowe projekty lub projektowanie zorientowane na domenę Definiujesz klasy encji. EF generuje schemat bazy danych z kodu.
Baza danych First Istniejąca baza danych EF generuje klasy encji i kontekst na podstawie istniejącego schematu.
Model First Jeśli wolisz projekt wizualny Projektowanie modelu odbywa się w projektancie wizualnym (Entity Designer), a EF generuje klasy i bazę danych.

Każde podejście sprawdza się w różnych scenariuszach: Najpierw kod jest popularny w zwinnym rozwoju, Baza danych First jest preferowany w przypadku starszych baz danych i Model First nadaje się do przypadków, w których istotne jest modelowanie wizualne.


3) Czym jest DbContext i jaką rolę odgrywa w EF?

DbContext jest klasą podstawową, która zarządza sesja z bazą danych, śledzi zmiany encji i koordynuje zapisywanie danych z powrotem do bazy danych. Stanowi pomost między aplikacją C# a bazą danych. Poprzez DbContext, definiujesz DbSet<TEntity> właściwości, które reprezentują zbiory jednostek i są mapowane na tabele w bazie danych.

Przykład:

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

Tutaj, Products działa jako kolekcja do wykonywania operacji CRUD. EF używa tego kontekstu do śledzić stany obiektów i generować polecenia SQL na SaveChanges().


4) Czym są migracje w Entity Framework i jak się je wykorzystuje?

Emigracja są mechanizmem do śledzenia i stosowania zmiany schematu do bazy danych w czasie. W miarę rozwoju modelu, migracje pomagają utrzymać synchronizację bazy danych bez konieczności ręcznej modyfikacji skryptów SQL. W Code First używasz poleceń takich jak:

Add-Migration InitialCreate
Update-Database

Generuje klasy migracji, które definiują zmiany schematu i stosują je do bazy danych. Migracje umożliwiają kontrolę wersji schematu bazy danych i ułatwiają współpracę przy tworzeniu oprogramowania.


5) Opisz ładowanie leniwe, ładowanie chętne i ładowanie jawne.

Efektywne ładowanie powiązanych danych jest kluczowe w EF. Oto porównanie:

Strategia Kiedy działa Typowe zastosowanie
Lazy Loading Powiązane dane załadowane przy pierwszym dostępie Stosuj, gdy powiązane dane nie zawsze są potrzebne.
Chętne ładowanie Powiązane dane załadowane z góry za pośrednictwem .Include() Używaj, gdy wiesz, że potrzebujesz powiązanych danych.
Jawne ładowanie Załadowano ręcznie po zapytaniu Umożliwia kontrolę nad tym, kiedy dokładnie zostaną załadowane odpowiednie dane.

Na przykład:

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

Leniwe ładowanie pomaga zmniejszyć liczbę zapytań początkowych, ale może powodować Problemy z zapytaniami N+1 jeśli nie są używane ostrożnie.


6) Na czym polega śledzenie zmian w Entity Framework?

Śledzenie zmian to wewnętrzny mechanizm EF służący do monitoruj zmiany stanu jednostki po wykonaniu zapytania. Gdy jednostka jest pobierana przez DbContext, jest śledzony. Wszelkie modyfikacje jego właściwości są odnotowywane i kiedy SaveChanges() zostanie wywołany, EF generuje odpowiedni kod SQL INSERT, UPDATElub DELETE instrukcji. W przypadku scenariuszy tylko do odczytu, w których śledzenie jest zbędne, AsNoTracking() zwiększa wydajność poprzez wyłączenie śledzenia zmian.


7) W jaki sposób Entity Framework radzi sobie z konfliktami współbieżności?

Kontrola współbieżności zapewnia, że ​​wielu użytkowników aktualizujących te same dane nie nadpisze przypadkowo swoich zmian. EF używa optymistyczna współbieżność domyślnie. Typowe podejście polega na dodaniu token współbieżności (jak RowVersion znacznik czasu). EF sprawdza ten token podczas SaveChanges()i jeśli różni się od wersji bazy danych, DbUpdateConcurrencyException Występuje błąd wskazujący na konflikt. Programiści mogą obsłużyć ten wyjątek i spróbować ponownie lub rozwiązać różnice w danych.


8) Czym są właściwości nawigacyjne w EF?

Właściwości nawigacyjne definiują relacje między encjami. Umożliwiają one EF nawiguj po stowarzyszeniach (np. jeden do wielu) bez łączenia ręcznego:

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

Tutaj, Customer jest właściwością nawigacyjną łączącą Order do powiązanych z nim CustomerEF używa tych właściwości do budowania relacji i automatycznego łączenia podczas zapytań. Właściwości nawigacyjne działają równolegle. klucz obcy modelować relacje.


9) Jaki jest cel AsNoTracking()?

AsNoTracking() wyłącza śledzenie zmian w zapytaniu, co jest korzystne dla tylko do odczytu Operacje, w których nie zamierzasz aktualizować pobranych jednostek. Poprawia to wydajność poprzez zmniejszenie zużycia pamięci i narzutu śledzenia. Jest to szczególnie przydatne podczas pobierania dużych zestawów danych bez ich modyfikowania.


10) Czym są zapytania kompilowane i kiedy należy ich używać?

Kompilowane zapytania to technika optymalizacji wydajności. Podczas wykonywania zapytania LINQ, EF zazwyczaj tłumaczy je na język SQL za każdym razem. W przypadku kompilowanych zapytań, tłumaczenie to jest wykonywane jednorazowo, a powstały delegat jest ponownie wykorzystywany, co zmniejsza obciążenie w przypadku często wykonywanych lub złożonych zapytań. Używaj ich w Duży ruch scenariusze, w których to samo zapytanie jest uruchamiane wielokrotnie z różnymi parametrami.


11) Czym są stany encji w Entity Framework i jak wpływają one na funkcję SaveChanges()?

Entity Framework śledzi każdą jednostkę były aby określić, jaką operację bazy danych wykonać podczas SaveChanges()Głównymi państwami zależnymi są:

Miasto OPIS OperaWyzwalana
W dodatku Nowy element do wstawienia INSERT
zmodyfikowany Istniejący podmiot został zaktualizowany UPDATE
Usunięte Podmiot oznaczony do usunięcia DELETE
Bez zmian Nie wykryto żadnych zmian żaden
Oderwany Nie śledzone przez kontekst żaden

Kiedy zadzwonisz SaveChanges()EF sprawdza stany encji i wykonuje odpowiadające im polecenia SQL. Na przykład, nowa encja dodana do DbSet będzie oznaczony W dodatku, w wyniku czego INSERT zapytania.

Przykład:

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

Powoduje to wyraźną aktualizację rekordu bazy danych dla jednostki.

Zrozumienie stanów zapewnia lepszą kontrolę nad synchronizacją danych i wydajnością.


12) Jakie są zalety i wady korzystania z Entity Framework?

Entity Framework zapewnia duże korzyści, ale wiąże się też z pewnymi kompromisami, w zależności od przypadku użycia.

Zalety Niedogodności
Ułatwia dostęp do danych za pomocą LINQ i modeli obiektowych. Obciążenie wydajnościowe w porównaniu do surowego ADO.NET.
Zmniejsza ilość szablonowego kodu SQL. Złożone zapytania mogą generować nieefektywny kod SQL.
Obsługuje wielu dostawców baz danych. Trudniejsze debugowanie wygenerowanych instrukcji SQL.
Mocno typizowane, co poprawia bezpieczeństwo kompilacji. W przypadku dużych zespołów możliwe są konflikty migracyjne.
Umożliwia szybkie prototypowanie z wykorzystaniem metody Code First. Less kontrola nad precyzyjnie dostrojonymi zapytaniami.

W przypadku systemów na dużą skalę wymagających maksymalnej wydajności programiści mogą nadal mieszać surowy SQL z EF do optymalizacji.


13) W jaki sposób Entity Framework obsługuje relacje (jeden do jednego, jeden do wielu, wiele do wielu)?

Entity Framework zarządza relacjami za pośrednictwem właściwości nawigacyjne oraz skojarzenia kluczy obcych.

Rodzaje relacji są następujące:

Typ relacji OPIS Przykład
Jeden na jednego Każda instancja encji ma jedną powiązaną encję. UserUserProfile
Jeden za dużo Jeden podmiot jest powiązany z wieloma innymi. CustomerOrders
Wiele do wielu Wiele podmiotów jest ze sobą powiązanych. StudentCourse

Przykład Jeden za dużo relacja:

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

EF automatycznie generuje klucze obce i uchwyty reguły usuwania kaskadowego w zależności od konfiguracji.

Można również użyć Płynne API w celu dokładniejszego mapowania relacji.


14) Jaka jest różnica między LINQ to Entities i LINQ to SQL?

Cecha LINQ do podmiotów LINQ do SQL
Obsługiwane bazy danych Wiele (SQL Server, Oracle, MySQLEtc.) Tylko SQL Server
Podstawowe ramy Struktura encji ADO.NET
Model Konceptualny model bytu Tylko tabele bazy danych
Mapowanie Mapowanie złożone (dziedziczenie, asocjacje) Bezpośrednie mapowanie tabel
Przyszłe wsparcie Aktywnie wspierane Nieaktualna

LINQ do podmiotów jest częścią Entity Framework i jest bardziej wszechstronny, podczas gdy LINQ do SQL jest ograniczony do SQL Server i prostszych przypadków użycia.

W związku z tym LINQ to Entities jest zalecane do tworzenia oprogramowania na poziomie przedsiębiorstwa.


15) Jaka jest różnica między ObjectContext i DbContext?

Cecha Kontekst obiektu Kontekst bazy danych
Wcześniejsze wersje EF Uproszczone API w EF 4.1+
Złożoność Więcej gadatliwych Lekki i łatwy
Wydajność Nieco szybszy, ale trudniejszy w użyciu Uproszczone, z minimalnym obciążeniem
Śledzenie zmian Wymagana ręczna konfiguracja Automatyczne śledzenie
Preferowane zastosowanie Stare systemy Nowoczesne projekty EF / EF Core

DbContext owija wewnętrznie ObjectContext ale zapewnia bardziej przejrzyste i intuicyjne API. Większość obecnych aplikacji .NET powinna korzystać z DbContext.


16) Wyjaśnij cykl życia jednostki w Entity Framework.

Cykl życia jednostki opisuje jej przejścia między stanami od stworzenia do trwałości:

  1. Tworzenie – Obiekt jest tworzony w pamięci (stan: Oderwany).
  2. Załącznik – Dodano do kontekstu poprzez DbSet.Add() (państwo: W dodatku).
  3. Modyfikacja – Zmiany wykryte automatycznie (stan: zmodyfikowany).
  4. Uporczywość - SaveChanges() wywoływane → wykonywane polecenia SQL.
  5. usunięcie – Podmiot oznaczony jako Usunięte i usunięte z bazy danych.

Zrozumienie tego cyklu życia pomaga w debugowaniu problemów z danymi i optymalizowaniu zarządzania kontekstem EF.


17) Do czego służy Fluent API w Entity Framework?

Płynne API zapewnia programowy sposób konfigurowania relacji, ograniczeń i mapowań modeli, często wykorzystywanych w OnModelCreating() metoda twoja DbContext.

Zapewnia szczegółową kontrolę nad konfiguracjami, które adnotacje danych nie potrafię wyrazić.

Przykład:

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

Interfejs API Fluent jest szczególnie wydajny w przypadku konfiguracji klucze złożone, relacje wiele-do-wielu, zasady kaskadowe.


18) Czym są adnotacje danych w Entity Framework?

Adnotacje danych są atrybuty Stosowane bezpośrednio do klas lub właściwości modelu w celu zdefiniowania zachowania schematu. Są prostsze niż Fluent API, ale mniej elastyczne.

Przykład:

public class Product
{
    [Key]
    public int ProductId { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }
}

Adnotacje definiują klucze, długości ciągów znaków, pola wymagane i relacje. W zaawansowanych przypadkach programiści zazwyczaj łączą Adnotacje danych oraz Płynne API.


19) Jaka jest różnica między encjami śledzonymi i nieśledzonymi w EF Core?

Typ OPIS Przypadek użycia
Śledzone jednostki Monitorowane przez DbContext na zmiany. Domyślne zachowanie aktualizacji.
Nieśledzone jednostki Nie monitorowane; pobrano z .AsNoTracking(). Idealne do operacji tylko do odczytu.

Śledzone obiekty zużywają więcej pamięci, ale pozwalają EF na automatyczne wykrywanie zmian.

Nieśledzone jednostki zwiększają jest gwarancją najlepszej jakości, które mogą dostarczyć Ci Twoje monitory, w scenariuszach o dużej liczbie odczytów i małej liczbie aktualizacji.


20) Jak można wykonywać surowe zapytania SQL w Entity Framework?

Entity Framework umożliwia wykonywanie surowych instrukcji SQL w przypadku zapytań niestandardowych lub wymagających dużej wydajności.

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

W przypadku poleceń innych niż zapytania:

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

Używaj tej funkcji ostrożnie, aby uniknąć SQL injection i zachować elastyczność niezależną od bazy danych.


21) Jaka jest różnica między Entity Framework i Entity Framework Core?

Entity Framework (EF) i Entity Framework Core (EF Core) różnią się architekturą, możliwościami i obsługą wielu platform.

Cecha Entity Framework 6 (EF6) Rdzeń platformy Entity
Platforma Tylko .NET Framework Międzyplatformowy (.NET 5/6/7)
Architektura Na podstawie ObjectContext Lekki i modułowy
Wydajność Wolniej w niektórych zapytaniach Zoptymalizowane generowanie zapytań
Wsparcie LINQ Dojrzały, ale ograniczony Ulepszone tłumaczenie i asynchronizacja
Dostawcy baz danych Serwer SQL, Oracle Wiele (MySQL, PostgreSQL, SQLiteEtc.)
Funkcje Dojrzałe (np. leniwe ładowanie) Nowoczesne (np. właściwości cienia, filtry globalne)

EF Core to nowoczesny, aktywnie rozwijany wersja i zalecany wybór dla nowych projektów .NET ze względu na swoją elastyczność i wydajność.


22) Jak działają transakcje w Entity Framework?

Transakcje w Entity Framework zapewniają integralność danych gdy wiele operacji musi zakończyć się sukcesem lub porażką jednocześnie. Domyślnie EF tworzy SaveChanges() wewnątrz transakcji. W przypadku sterowania ręcznego:

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();
    }
}

Zapewnia to atomowość — jeśli którekolwiek polecenie się nie powiedzie, wszystkie zmiany zostaną wycofane.

EF integruje się również z System.Transakcje do obsługi rozproszonych transakcji.


23) Wyjaśnij strategie dziedziczenia TPH, TPT i TPC w Entity Framework.

Entity Framework obsługuje trzy główne strategie mapowania dziedziczenia służące do modelowania hierarchii klas.

Strategia OPIS Przykład Zalety Niedogodności
TPH (Tabela według hierarchii) Wszystkie klasy współdzielą jedną tabelę; kolumna dyskryminatora identyfikuje typ. Typowe dla EF Core. Proste i szybkie zapytania. Tabela może być duża i rzadka.
TPT (Tabela według typu) Każda podklasa ma własną tabelę. Każda klasa pochodna jest mapowana osobno. Znormalizowany schemat. Wolniejsze łączenia w przypadku dużych hierarchii.
TPC (Tabela według klasy betonu) Każda klasa ma własną tabelę z powielonymi kolumnami. Każda jednostka mapowana jest osobno. Odczyty o wysokiej wydajności. Nadmiarowość danych.

Większość programistów woli TPH ze względu na prostotę, chyba że względy normalizacyjne lub wymagania wydajnościowe stanowią inaczej.


24) Jak radzisz sobie z dostrajaniem wydajności w Entity Framework?

Aby zoptymalizować wydajność Entity Framework:

  1. Zastosowanie AsNoTracking() dla zapytań tylko do odczytu.
  2. Chętny ładunek tylko niezbędne podmioty powiązane z .Include().
  3. Unikaj zapytań N+1 za pomocą projekcji lub Select().
  4. Użyj skompilowanych zapytań do często przeprowadzanych operacji.
  5. Wstawianie/aktualizowanie wielu partii w AddRange() oraz SaveChanges().
  6. Wyłącz automatyczne wykrywanie zmian dla operacji masowych: context.Configuration.AutoDetectChangesEnabled = false;
  7. Użyj buforowania i paginacji dla dużych zbiorów danych.

Dobrze dostrojona implementacja EF może zbliżyć się do wydajności ADO.NET, zachowując jednocześnie produktywność programisty.


25) Czym jest właściwość cienia w Entity Framework Core?

A nieruchomość cienia Istnieje w modelu EF, ale nie w klasie encji. Jest utrzymywany przez EF w systemie śledzenia zmian i przechowywany w bazie danych.

Przykład:

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

Dzięki temu EF może przechowywać dodatkowe metadane (np. znaczniki czasu, informacje o audycie) bez konieczności modyfikowania klasy encji.

Dostęp do właściwości cienia można uzyskać poprzez:

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

Właściwości cienia idealnie nadają się do rejestrowania zdarzeń lub przeprowadzania audytów.


26) Czym są konwertery wartości w EF Core?

Konwertery wartości w EF Core umożliwiają transformację wartości właściwości podczas odczytu z bazy danych lub zapisu do niej.

Na przykład, aby zapisać wyliczenie jako ciąg znaków:

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

Zwiększa to elastyczność niestandardowych typów danych, takich jak enum, boollub DateTimeOffset.

Konwertery wartości są również wykorzystywane do: szyfrowanie, kompresja lub maskowanie wrażliwych danych.


27) Czym są globalne filtry zapytań i jak działają?

Globalne filtry zapytań umożliwiają automatyczne stosowanie warunków do wszystkich zapytań dotyczących danej jednostki.

Jest to szczególnie przydatne w przypadku miękkie usuwanie or wielu najemców.

Przykład:

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

Każde zapytanie wykonane w Employee automatycznie wyklucza rekordy, które zostały usunięte w sposób nieznaczny, chyba że zostanie to wyraźnie pominięte.

Filtry globalne poprawiają łatwość obsługi i bezpieczeństwo danych.


28) Jak można testować kod Entity Framework za pomocą testów jednostkowych?

Aby przeprowadzić test jednostkowy logiki EF bez korzystania z prawdziwej bazy danych, użyj bazy danych w pamięci or szyderczy:

  • Opcja 1: Dostawca pamięci wewnętrznej
    var options = new DbContextOptionsBuilder<AppDbContext>()
        .UseInMemoryDatabase("TestDb")
        .Options;
    
  • Opcja 2: Mock DbContext
    Drwić DbSet korzystając z bibliotek takich jak Moq do testów izolowanych.

Testy jednostkowe powinny weryfikować:

  • Poprawność zapytania (poprzez LINQ)
  • Spójność danych po SaveChanges()
  • Logika repozytorium

Testowanie z wykorzystaniem EF Core InMemory gwarantuje szybkość i eliminuje zależność od serwera SQL Server.


29) Wyjaśnij wzorce Repozytorium i Jednostki Pracy w EF.

Te dwa wzorce architektoniczne pomagają abstrakcyjny dostęp do danych oraz zachować spójność transakcyjną.

Wzór Cel Przykład wdrożenia
Magazyn Hermetyzuje operacje CRUD dla każdej jednostki. IRepository<T> interfejs z Add(), GetAll(), itp.
Jednostka pracy Koordynuje wiele repozytoriów w ramach transakcji. SaveChanges() działa jako granica zatwierdzenia.

Przykład:

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

Te wzorce się poprawiają testowalność, ponowne wykorzystanie kodu, rozdzielenie obaw w dużych aplikacjach korporacyjnych.


30) Jaka jest różnica między ładowaniem z wyprzedzeniem a ładowaniem projekcyjnym?

WYGLĄD Chętne ładowanie Ładowanie projekcji
Cel Załaduj powiązane dane z góry Ładuje tylko określone pola lub właściwości
Metoda wykonania .Include() .Select()
Przykład context.Orders.Include(o => o.Customer) context.Orders.Select(o => new { o.Id, o.Customer.Name })
Wydajność Pobiera pełne obiekty Pobiera minimalne dane
Przypadek użycia Gdy do przetwarzania potrzebne są podmioty powiązane Kiedy potrzebujesz konkretnych, lekkich danych

Ładowanie projekcji to optymalizacja wydajności co zmniejsza obciążenie pamięci poprzez wybieranie tylko niezbędnych kolumn.


31) Czym są przechwytywacze w Entity Framework Core?

Przechwytywacze w EF Core umożliwiają programistom przechwytywanie i modyfikowanie operacji baz danych, takich jak: wykonywanie zapytań, tworzenie poleceń i otwieranie połączeń.

Działają jako komponenty pośredniczące między EF a dostawcą bazy danych.

Przykład: Rejestrowanie wszystkich wykonanych poleceń 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);
    }
}

Rejestrujesz to w DbContextOptionsBuilder:

optionsBuilder.AddInterceptors(new CommandInterceptor());

Korzyści:

  • Ulepszone rejestrowanie
  • Bezpieczeństwo (walidacja zapytań)
  • Audyt i monitorowanie wydajności

32) W jaki sposób EF Core obsługuje operacje asynchroniczne?

Entity Framework Core w pełni obsługuje programowanie asynchroniczne za pomocą metod takich jak SaveChangesAsync(), ToListAsync(), FirstOrDefaultAsync().

Wykonywanie asynchroniczne pomaga poprawić skalowalność w aplikacjach internetowych poprzez zwalnianie wątków podczas oczekiwania na operacje bazy danych związane z wejściem/wyjściem.

Przykład:

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

Operacje asynchroniczne są szczególnie efektywne w przypadku dużej przepustowości Interfejsy API ASP.NET Core i mikrousług, co pozwala ograniczyć liczbę blokujących wywołań i skrócić czas reakcji.


33) Czym jest odporność połączenia w Entity Framework Core?

Odporność połączenia pomaga Twojej aplikacji automatyczne odzyskiwanie po przejściowych awariach bazy danychtakie jak przerwy w działaniu sieci lub przekroczenia limitu czasu SQL.

Można go skonfigurować w następujący sposób:

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

W tym przypadku EF będzie ponawiać nieudane operacje do 5 razy z opóźnieniami.

Jest to szczególnie przydatne w środowiska hostowane w chmurze lubić Azure SQL, w którym częste są błędy przejściowe.


34) Czym są typy encji posiadanych w EF Core?

Posiadane podmioty umożliwiają modelowanie obiekty wartościowe które zależą całkowicie od cyklu życia innej jednostki.

Znajdują się w tej samej tabeli co ich właściciel i nie mogą istnieć niezależnie.

Przykład:

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; }
}

Konfiguracja:

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

Przypadek użycia:

Modelowanie koncepcji takich jak Adres, Pieniężnelub Pomiary które nie mają własnej tożsamości.


35) Jak można wdrożyć usuwanie miękkie w Entity Framework Core?

Miękkie usuwanie oznacza rekordy jako usunięte zamiast ich fizycznego usuwania.

Są one wdrażane za pomocą flaga logiczna oraz globalne filtry zapytań.

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

W operacji usuwania:

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

Zalety:

  • Zachowywanie danych historycznych
  • Łatwiejsze odzyskiwanie

Niedogodności:

  • Większe tabele bazy danych
  • Wymaga starannej logiki filtrowania

36) Czym jest skompilowany model w EF Core i dlaczego się go używa?

W EF Core 6+ skompilowane modele umożliwiają wstępną kompilację metadanych modelu EF do zestawu .NET, co skraca czas uruchamiania i obciążenie środowiska wykonawczego.

Kroki:

  1. Uruchom polecenie: dotnet ef dbcontext optimize
  2. EF generuje wstępnie skompilowany plik modelu, który aplikacja ładuje szybciej w czasie wykonywania.

Korzyści: Zmniejsza opóźnienie inicjalizacji o 30–40%, zwłaszcza w dużych aplikacjach z wieloma jednostkami.

Przypadek użycia: Wysokowydajne mikrousługi i środowiska bezserwerowe.


37) Jak można zaimplementować buforowanie w Entity Framework?

Buforowanie pomaga zredukować liczbę powtarzających się zapytań do bazy danych. Istnieją dwa główne poziomy:

Typ OPIS Przykład
Pamięć podręczna pierwszego poziomu Wbudowany, na DbContext przykład Zarządzane automatycznie
Pamięć podręczna drugiego poziomu Pamięć podręczna zewnętrzna współdzielona między kontekstami Użyj bibliotek takich jak EFCoreSecondLevelCacheInterceptor

Przykład buforowania drugiego poziomu:

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

Znacznie poprawia to wydajność w aplikacje intensywnie odczytujące poprzez unikanie zbędnych trafień do bazy danych.


38) W jaki sposób EF Core zarządza tokenami współbieżności i znacznikami czasu?

Tokeny współbieżności zapobiegają sprzeczne aktualizacje w środowiskach wielodostępnych.

Możesz oznaczyć właściwość jako token współbieżności za pomocą [ConcurrencyCheck] or [Timestamp] atrybutów.

Przykład:

public class Product
{
    public int Id { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

Gdy nastąpi aktualizacja, EF uwzględnia tę kolumnę w WHERE klauzula.

Jeśli wartość jest niezgodna, DbUpdateConcurrencyException jest rzucany — zapewniając optymistyczna kontrola współbieżności.


39) Jak wdrożyć audyt (śledzenie utworzonych, zmodyfikowanych i usuniętych elementów) w EF Core?

Audyt śledzi metadane, takie jak: kto utworzył, zmodyfikował lub usunął Records.

Możesz to zastąpić 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();
}

Interfejs:

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

Ta metoda centralizuje logikę audytu, zapewniając spójne zarządzanie danymi.


40) Jakie są najlepsze praktyki stosowania Entity Framework w aplikacjach korporacyjnych?

Kategoria Best Practice Korzyści
Wydajność Zastosowanie AsNoTracking() i projekcje dla zapytań tylko do odczytu. Zmniejsza koszty ogólne.
Wnętrze Wdrożenie wzorców repozytorium i jednostki pracy. Poprawia łatwość utrzymania.
Ochrona Używaj zapytań parametrycznych, aby uniknąć ataków SQL. Ochrona danych.
Skalowalność Użyj puli połączeń i metod asynchronicznych. Wytrzymuje duże obciążenia.
Emigracja Korzystaj z automatycznych migracji z kontrolą wersji. Upraszcza zarządzanie schematami.
Konfiguracja Uzewnętrznij ciągi połączeń i sekrety. Lepsza izolacja środowiska.
Testy Użyj dostawcy InMemory do testów jednostkowych. Szybsze przebiegi testowe.
Logowanie Włącz rejestrowanie EF w celu uzyskania informacji o wydajności. Łatwiejsze debugowanie.

Praktyki te zapewniają solidny, skalowalny i łatwy w utrzymaniu aplikacje zbudowane na Entity Framework.


41) Jak można zoptymalizować zapytania LINQ w celu uzyskania lepszego tłumaczenia SQL w Entity Framework?

Entity Framework automatycznie konwertuje zapytania LINQ na SQL, ale nieefektywne wzorce mogą generować powolny lub powtarzający się kod SQL. Optymalizacja LINQ zapewnia, że ​​ORM generuje wydajne zapytania do bazy danych.

Techniki optymalizacji:

Użyj projekcji:

  1. Wybierz tylko wymagane kolumny zamiast całych obiektów.
  2. var customers = context.Customers
        .Select(c => new { c.Id, c.Name })
        .ToList();
    
  3. Unikaj oceny po stronie klienta:
    Zawsze upewnij się, że filtrowanie jest wykonywane w SQLu, nie ma go w pamięci. EF Core wyświetla ostrzeżenie, gdy ocena jest przeprowadzana po stronie klienta.
  4. Zastosowanie AsNoTracking() dla danych tylko do odczytu.
  5. var orders = context.Orders.AsNoTracking().ToList();
  6. Wykorzystaj skompilowane zapytania do powtarzających się operacji LINQ.
  7. Unikaj niepotrzebnych .Include() Połączenia — uwzględniaj powiązane dane tylko wtedy, gdy jest to konieczne.

Przykład:

Nieskuteczny:

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

Wydajny:

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

42) Jakie są różne sposoby inicjowania danych w EF Core?

Zasiewanie danych zapewnia, że ​​baza danych ma dane domyślne lub referencyjne w momencie utworzenia.

Podejście 1: Korzystanie z ModelBuilder

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

Wprowadza dane automatycznie podczas Update-Database.

Podejście 2: Metoda niestandardowego ziarna

Wykonaj kod ręcznie podczas uruchamiania:

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

Podejście 3: Skrypty SQL

Użyj surowego SQL podczas migracji:

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

Zalecenie:
Zastosowanie HasData() do statycznych danych referencyjnych i programowego zasiewania dynamicznych danych startowych.


43) W jaki sposób EF Core wewnętrznie zarządza dostawcami baz danych?

EF Core to niezależny od dostawcy, co oznacza, że ​​może obsługiwać wiele silników baz danych za pośrednictwem oddzielnych pakiety dostawców baz danych.

Typowi dostawcy:

Provider NuGet Pakiet Baza danych
SQL Server Microsoft.EntityFrameworkCore.SqlServer MSSQL
SQLite Microsoft.EntityFrameworkCore.Sqlite Telefon komórkowy/komputer stacjonarny
PostgreSQL Npgsql.EntityFrameworkCore.PostgreSQL PostgreSQL
MySQL Pomelo.EntityFrameworkCore.MySql MySQL
Kosmos DB Microsoft.EntityFrameworkCore.Cosmos NoSQL

Wewnętrznie EF Core wykorzystuje warstwy abstrakcji do:

  • Tłumaczenie zapytania
  • Generowanie poleceń SQL
  • Mapowanie typów danych

Każdy dostawca implementuje własne klasy dziedziczące z podstawowych abstrakcji EF Core (np. RelationalDatabaseProvider, QuerySqlGenerator).


44) Czym jest „zapytanie podzielone” i kiedy należy go używać?

Podział zapytań uniemożliwia wykonanie EF duże, złożone połączenia wykonując wiele zapytań SQL zamiast jednego.

Przykład:

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

To wykonuje:

  1. Zapytanie 1 → Uzyskaj klientów
  2. Zapytanie 2 → Pobierz zamówienia związane z tymi klientami

Korzyści:

  • Zapobiega powstawaniu dużych iloczynów kartezjańskich.
  • Zwiększa wydajność w przypadku dużych, powiązanych zestawów danych.

Wada:

Wielokrotne przesyłanie danych do bazy danych.

Zastosowanie podzielone zapytania podczas szybkiego ładowania dużych, powiązanych danych, może to powodować problemy z pamięcią.


45) Jak można skutecznie monitorować polecenia SQL generowane przez EF?

Monitorowanie SQL pomaga debugować wolne zapytania i optymalizować działanie ORM.

Metody rejestrowania SQL:

  1. Rejestrowanie konsoli
  2. optionsBuilder
        .UseSqlServer(conn)
        .LogTo(Console.WriteLine, LogLevel.Information);
    
  3. Integracja z ILoggerFactory
  4. var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
    optionsBuilder.UseLoggerFactory(loggerFactory);
    
  5. Przechwytywacze Wdrożenie DbCommandInterceptor do przechwytywania poleceń i czasu.
  6. Narzędzia do profilowania Użyj narzędzi takich jak:
    • MiniProfiler
    • Profiler SQL Server
    • EFCorePowerTools

Rejestrowanie powinno być włączane selektywnie w produkcji, aby uniknąć nadmiernego obciążenia wydajności.


46) Jaka jest różnica między ChangeTracker.DetectChanges() i AutoDetectChangesEnabled?

Cecha DetectChanges() AutoDetectChangesEnabled
Typ Metoda wykonania Nieruchomość
Cel Zmusza EF do skanowania śledzonych jednostek i wykrywania zmian Włącza/wyłącza automatyczne wykrywanie zmian
Domyślnie Instrukcja obsługi Prawdziwy
Stosowanie Wyraźnie wezwij do optymalizacji wydajności Wyłącz w przypadku aktualizacji zbiorczych

Przykład:

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

Wyłączenie automatycznego wykrywania w pętlach poprawia wydajność nawet o 40% w operacjach masowych.


47) Jak używać tabel temporalnych w EF Core?

Tabele czasowe (wprowadzone w SQL Server 2016) umożliwiają: śledzić dane historyczne automatycznie.

Kroki:

  1. Włącz obsługę czasową podczas migracji:
  2. builder.Entity<Employee>()
        .ToTable("Employees", b => b.IsTemporal());
    
  3. Zapytanie o dane historyczne:
  4. var history = context.Employees
        .TemporalAsOf(DateTime.UtcNow.AddDays(-7))
        .ToList();
    

Zalety:

  • Wbudowane śledzenie historii danych
  • Audyt i zgodność
  • Nie są wymagane żadne ręczne wyzwalacze

EF Core 6+ obsługuje pełne zapytania temporalne.


48) W jaki sposób EF Core obsługuje jednocześnie skompilowane zapytania i wstępnie wygenerowane modele?

Kompilowane zapytania i kompilowane modele to dwa funkcje wydajnościowe które się wzajemnie uzupełniają.

Cecha Cel
Skompilowane zapytania Wyniki tłumaczenia zapytania pamięci podręcznej
Skompilowane modele Prekompiluj metadane modelu

Przykład skompilowanego zapytania:

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

Stosowanie:

var customer = _getCustomerById(context, 5);

Razem: Skompilowane modele redukują koszt zaczęcia biznesupodczas gdy skompilowane zapytania redukują narzut zapytań w czasie wykonywania — idealny dla zapytania o wysokiej częstotliwości.


49) Jakie są typowe pułapki przy stosowaniu EF w architekturze mikrousług?

Typowe błędy:

  1. Współdzielony kontekst bazy danych w usługach
    → Narusza izolację mikrousług.
    → Każda mikrousługa powinna mieć własny DbContext i schemat.
  2. Komunikacja w formie rozmów (N+1 zapytań)
    → Zminimalizuj liczbę zapytań EF na wywołanie API.
  3. Nadmierne ładowanie z zapałem
    → Za pomocą DTO ładuj tylko to, co jest potrzebne.
  4. Centralizowane migracje
    → Każda usługa powinna niezależnie zarządzać swoimi migracjami.
  5. Brak granic transakcyjnych
    → Jeśli wymagana jest spójność między usługami, należy stosować transakcje rozproszone (wzorzec Outbox).
  6. Ścisłe sprzężenie z dostawcą SQL
    → Wykorzystaj abstrakcję repozytorium, aby zachować elastyczność w wyborze bazy danych.

50) W jaki sposób wstrzykiwanie zależności integruje się z DbContext w ASP.NET Core?

Entity Framework bezproblemowo integruje się z Wbudowana funkcja wstrzykiwania zależności (DI) w ASP.NET Core pomimo napiętego harmonogramu

Konfiguracja:

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

Następnie wstrzyknij go do kontrolerów lub usług:

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

Żywoty:

Życie OPIS Polecane dla
Zakres Jeden kontekst na żądanie HTTP Domyślnie
Przejściowy Nowa instancja za każdym razem Praca w tle
Singel Udostępniane globalnie Unikaj (nie jest bezpieczne dla wątków)

Korzystanie z DI zapewnia testowalność, zarządzanie cyklem życia, efektywności wykorzystania zasobów w obrębie sieci i procesów działających w tle.


🔍 Najważniejsze pytania do rozmów kwalifikacyjnych dotyczące Entity Framework, scenariusze z życia wzięte i odpowiedzi strategiczne

1) Czym jest Entity Framework i dlaczego jest stosowany w aplikacjach korporacyjnych?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce ocenić Twoją podstawową wiedzę na temat Entity Framework i jej przydatność w rzeczywistych zastosowaniach.

Przykładowa odpowiedź: Entity Framework to framework mapowania obiektowo-relacyjnego dla platformy .NET, który umożliwia programistom pracę z bazami danych przy użyciu obiektów .NET zamiast surowego kodu SQL. Jest on wykorzystywany w aplikacjach korporacyjnych w celu zwiększenia produktywności, redukcji szablonowego kodu dostępu do danych i zachowania silnego rozdzielenia zadań.


2) Czy możesz wyjaśnić różnicę pomiędzy podejściami Code First, Database First i Model First?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce ocenić Twoją wiedzę na temat różnych procesów pracy w środowisku programistycznym i dowiedzieć się, kiedy stosować każdy z nich.

Przykładowa odpowiedź: Code First zaczyna od klas domen i generuje bazę danych na podstawie kodu. Database First zaczyna od istniejącej bazy danych i generuje klasy encji. Model First używa projektanta wizualnego do zdefiniowania modelu, a następnie tworzy kod i bazę danych. Każde podejście jest wybierane na podstawie wymagań projektu i istniejącej infrastruktury.


3) W jaki sposób Entity Framework obsługuje relacje między tabelami?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną sprawdza Twoją wiedzę na temat modelowania danych i mapowania relacji.

Przykładowa odpowiedź: Entity Framework obsługuje relacje za pomocą właściwości nawigacyjnych i kluczy obcych. Obsługuje relacje jeden do jednego, jeden do wielu i wiele do wielu, umożliwiając programistom przeglądanie powiązanych danych za pomocą referencji do obiektów, a nie łączeń.


4) Opisz sytuację, w której udało Ci się poprawić wydajność bazy danych wykorzystując Entity Framework.

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce usłyszeć praktyczny przykład demonstrujący umiejętności optymalizacji.

Przykładowa odpowiedź: Na moim poprzednim stanowisku poprawiłem wydajność, redukując zbędne ładowanie z niecierpliwością i wdrażając zapytania projekcyjne za pomocą instrukcji SELECT. Zminimalizowało to ilość danych pobieranych z bazy danych i znacząco skróciło czas wykonywania zapytań.


5) Jak zarządzać migracjami w Entity Framework?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną ocenia Twoje doświadczenie w zakresie zmian schematu i kontroli wersji.

Przykładowa odpowiedź: Migracje są zarządzane za pomocą wbudowanych narzędzi migracyjnych, które śledzą zmiany modelu w czasie. Na poprzednim stanowisku regularnie generowałem i weryfikowałem skrypty migracyjne przed ich wdrożeniem, aby zapewnić integralność bazy danych w różnych środowiskach.


6) Czym jest leniwe ładowanie i kiedy należy unikać jego stosowania?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce sprawdzić, czy rozumiesz strategie ładowania danych i kompromisy dotyczące wydajności.

Przykładowa odpowiedź: Lazy loading automatycznie ładuje powiązane dane w momencie dostępu do nich. Unikałbym jego stosowania w scenariuszach krytycznych pod względem wydajności lub w interfejsach API, ponieważ może powodować wiele niezamierzonych wywołań bazy danych, co prowadzi do problemu N+1 zapytań.


7) Jak obsługujesz transakcje w Entity Framework?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną ocenia Twoją wiedzę na temat spójności danych i obsługi błędów.

Przykładowa odpowiedź: Entity Framework obsługuje transakcje za pośrednictwem DbContext i TransactionScope. W mojej poprzedniej pracy korzystałem z jawnych transakcji, aby zapewnić, że wiele powiązanych operacji na bazie danych zakończy się sukcesem lub zostanie wycofanych w przypadku awarii.


8) Wyjaśnij, w jaki sposób wstrzykiwanie zależności jest wykorzystywane w Entity Framework.

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce sprawdzić, jak dobrze rozumiesz nowoczesną architekturę aplikacji.

Przykładowa odpowiedź: Wstrzykiwanie zależności służy do wstrzykiwania DbContext do usług lub kontrolerów. Poprawia to testowalność i łatwość utrzymania, umożliwiając symulowanie lub zastępowanie kontekstu bez zmiany logiki biznesowej.


9) Opisz trudny błąd, na jaki natrafiłeś w Entity Framework i jak go rozwiązałeś.

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną będzie odpowiedzialna za umiejętność rozwiązywania problemów i wyszukiwania błędów.

Przykładowa odpowiedź: Na moim poprzednim stanowisku napotkałem problem ze śledzeniem konfliktów podczas aktualizacji odłączonych encji. Rozwiązałem go, jawnie ustawiając stany encji i upewniając się, że kontekst śledzi tylko jedno wystąpienie każdej encji.


10) Jak stwierdzić, czy Entity Framework nie jest właściwym narzędziem?

Oczekuje się od kandydata: Osoba przeprowadzająca rozmowę kwalifikacyjną chce poznać Twoją zdolność oceny sytuacji i doboru odpowiednich technologii.

Przykładowa odpowiedź: Rozważam alternatywy, gdy aplikacje wymagają niezwykle wydajnego dostępu do danych lub złożonej logiki procedur składowanych. W takich przypadkach użycie mikro-ORM lub surowego ADO.NET może zapewnić większą kontrolę i wydajność.

Podsumuj ten post następująco: