Wprowadzenie
Klasa DbContext jest integralną częścią Entity Framework. Instancja DbContext reprezentuje sesję z bazą danych, która może być użyta do zapytań oraz poleceń do bazy danych. Implementacja klasy DbContext jest kombinacją dwóch wzorców projektowych: Unit of Work oraz Repository.
DbContext pozwala na wykonywanie następujących zadań:
- Zarządzanie połączeniem z bazą danych;
- Konfigurację modelu i relacji;
- Wykonywanie zapytań na bazie danych;
- Zapisywanie danych w bazie danych;
- Konfigurację ustawień związanych ze śledzeniem zmian;
- Buforowanie danych;
- Zarządzanie transakcjami.
Poprzedni wpis bazował na podejściu database-first. Nie chciałem komplikować kolejnych wpisów tylko płynnie zacząć od wszelkich składowych technologii EF Core. Co jednak w sytuacji gdy nie posiadamy istniejącej bazy danych a samo prototypowanie chcemy rozpocząć z poziomu kodu wykorzystując podejście code-first?
Naszą odpowiedzialnością jest utworzenie klasy kontekstowej, która dziedziczy po DbContext. Tym razem przygotuję prosty szkielet klasy i dodam wyjaśnia związane z poszczególnymi składowymi:
// DbContext wymaga paczki: Microsoft.EntityFrameworkCore
public class ApplicationDbContext : DbContext
{
#region Entities
// Właściwości DbSet<TEntity> typu CarCompanies oraz CompaniesData
public DbSet<CarCompanies> CarCompanies { get; set; }
public DbSet<CompaniesData> CompaniesData { get; set; }
#endregion
public ApplicationDbContext()
{
}
// Metoda pozwala na wskazanie i konfigurację źródła danych
// Przykład użycia był doskonale widoczny w poprzednim wpisie
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
// Metoda pozwala na konfigurację modelu przy wykorzystaniu Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
Metody klasy DbContext
Mamy już coraz mocniejsze podstawy (Tak, ten cykl jest również doskonałą nauką dla mojej osoby. Do każdego z punktów staram się dołączać wyczerpujące wyjaśnienia, zewnętrzne linki – wszystko dla tego, że sam również chce zrozumieć cały framework).
Najpopularniejszą metodą (o której wspominałem już wielokrotnie) jest SaveChanges() oraz asynchroniczny odpowiednik SaveChangesAsync(). Metoda jest odpowiedzialna za wykonywanie poleceń INSERT, UPDATE oraz DELETE. Spójrzmy jednak na poniższą tabelę celem poznania innych metod dostępnych w obrębie DbContext:
Metoda
|
Użycie
|
Add
|
Dodanie nowej encji do DbContext wraz ze statusem Added. Domyślnie w EF Core śledzenie zmian jest włączone. Dodanie danych do bazy danych następuje po wywołaniu metody SaveChanges().
|
AddAsync
|
Asynhroniczne wywołanie powyższej metody.
|
AddRange
|
Dodanie kolekcji (zbioru encji) do DbContext wraz ze śledzeniem zmian. Zbiór encji zostaje dodany do bazy dnaych po wywołaniu metody SaveChanges().
|
AddRangeAsync
|
Asynchroniczne wywołanie powyższej metody.
|
Attach
|
Dołączenie nowej lub istniejącej encji do DbContext w stanie niezmienionym wraz z rozpoczęciem śledzenia zmian.
|
AttachRange
|
Dodanie zbioru nowych lub istniejących encji do DbContext w stanie niezmienionym wraz z rozpoczęciem śledzenia zmian.
|
Entry
|
Pobranie EntityEntry dla danej encji. Mechanim pozwala na dostęp do informacji o zmianach oraz operacjach wykonywanych na danej encji.
|
Find
|
Wyszukiwanie encji na bazie podanego klucza.
|
FindAsync
|
Asynchroniczne wywołanie powyższej metody.
|
Remove
|
Zmiana stanu encji na Deleted. Usunięcie z bazy danych następuje po wywołaniu metody SaveChanges().
|
RemoveRange
|
Zmiana stanu kolekcji (zbioru encji) na Deleted. Usunięcie z bazy danych następuje po wywołaniu metody SaveChanges().
|
Set
|
Utworzenie obiektu DbSet<TEntity>, który może być używany do odczytu i zapisu stanu danej instancji TEntity.
|
Update
|
Dołączenie odłączonej encji w stanie zmodyfikowanym do DbContext oraz rozpoczęcie śledzenia zmian. Dane zostaną zapisane w bazie danych po wywołaniu metody SaveChanges().
|
UpdateRange
|
Podobne działanie jak w przypadku metody Update - tym razem dla zbioru encji.
|
OnConfiguring
|
Nadpisanie tej metody pozwala na konfigurację bazy danych, która jest używana w danym kontekście. Metoda jest wywoływana dla każdej instancji tworzonego kontekstu.
|
OnModelCreating
|
Nadpisanie tej metody pozwala na dalszą konfigurację modelu, który został zdefiniowany jako właściwość klasy kontekstowej przy wykorzystaniu DbSet<TEntity>.
|
W Entity Framework możemy operować na dwóch scenariuszach:
-
Powiązane encje (connected scenario) - dana encja jest pobierana z bazy danych i modyfikowana w tym samym kontekście;
-
Rozłączone encje (disconnected scenario) - dana encja jest pobierana z bazy danych i modyfikowana w innym kontekście, np. w warstwie logiki biznesowej naszej aplikacji. DbContext nie wie o modyfikacjach wykonywanych poza instancją obecnej klasy kontekstowej.
Ten temat szczegółowo poruszymy jednak nieco później.
Zwieńczeniem tego wpisu jest zapoznanie się z właściwościami klasy kontekstowej DbContext.
Metoda
|
Użycie
|
ChangeTracker
|
Dostęp do informacji i operacji dla danej encji w danym kontekście.
|
Database
|
Dostęp do informacji i operacji dla danej bazy danych w danym kontekście,
|
Model
|
Dostęp do metadanych dotyczących encji, relacji oraz sposobu mapowania.
|