Paweł Łukasiewicz
2021-03-05
Paweł Łukasiewicz
2021-03-05
Udostępnij Udostępnij Kontakt
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.