Podstawy DbContext i DbSet
Skonfiguruj DbContext, zdefiniuj encje, ustaw connection string i wykonaj pierwsze zapytanie.
Podstawy DbContext i DbSet to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Czym jest Entity Framework Core
EF Core to oficjalny mechanizm mapowania obiektowo-relacyjnego (ORM) platformy .NET. Mapuje klasy C# (encje) na tabele bazy danych i umożliwia odpytywanie oraz zapisywanie danych za pomocą LINQ — bez konieczności pisania SQL w większości operacji.
Definiowanie encji
Encja to zwykła klasa C#, której właściwości są mapowane na kolumny bazy danych. Zgodnie z konwencją właściwość o nazwie Id lub <TypeName>Id staje się kluczem głównym.
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public int Stock { get; set; }
public DateTime CreatedAt { get; set; }
}Tworzenie DbContext
DbContext jest bramą do bazy danych. Zawiera właściwości DbSet<T> dla każdej encji oraz zarządza połączeniem, śledzeniem zmian i transakcjami.
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<Product> Products => Set<Product>();
public DbSet<Order> Orders => Set<Order>();
}Rejestrowanie DbContext w DI
Należy wywołać AddDbContext w pliku Program.cs, aby zarejestrować kontekst jako usługę Scoped i skonfigurować dostawcę bazy danych.
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("Default")));
// For SQLite (great for development/testing):
// options.UseSqlite("Data Source=app.db");Podstawowe zapytania z DbSet
DbSet<T> udostępnia operatory LINQ. Zapytania nie są wykonywane do momentu ich wyliczenia (await ...ToListAsync()). Nazywa się to odroczonym wykonaniem.
public class ProductService
{
private readonly AppDbContext _db;
public ProductService(AppDbContext db) => _db = db;
public async Task<List<Product>> GetExpensiveAsync(decimal minPrice)
{
return await _db.Products
.Where(p => p.Price >= minPrice)
.OrderBy(p => p.Name)
.ToListAsync();
}
}Wyszukiwanie według klucza głównego
FindAsync najpierw sprawdza lokalną pamięć podręczną mechanizmu śledzenia zmian, zanim odwoła się do bazy danych. Należy używać go podczas wyszukiwania według klucza głównego, aby uniknąć zbędnych odwołań do bazy danych.
var product = await _db.Products.FindAsync(42);
if (product is null)
throw new KeyNotFoundException("Product not found");
// For complex keys, pass all key values:
var orderLine = await _db.OrderLines.FindAsync(orderId, productId);Dodawanie nowych rekordów
Należy wywołać Add, aby oznaczyć encję do wstawienia, a następnie SaveChangesAsync, aby zatwierdzić zmianę. EF Core generuje instrukcję SQL INSERT i uzupełnia automatycznie generowane pole Id.
var product = new Product
{
Name = "Mechanical Keyboard",
Price = 149.99m,
Stock = 50,
CreatedAt = DateTime.UtcNow
};
_db.Products.Add(product);
await _db.SaveChangesAsync();
Console.WriteLine(product.Id); // Auto-generated PKAktualizowanie rekordów
Encje załadowane przez EF Core są śledzone. Należy bezpośrednio zmodyfikować ich właściwości i wywołać SaveChangesAsync — EF Core wykryje zmiany i wygeneruje zoptymalizowaną instrukcję UPDATE.
var product = await _db.Products.FindAsync(42);
if (product is not null)
{
product.Price = 129.99m;
product.Stock -= 1;
await _db.SaveChangesAsync(); // UPDATE Products SET Price=...
}Usuwanie rekordów
Należy wywołać Remove, aby oznaczyć encję do usunięcia, a następnie SaveChangesAsync. Do usuwania zbiorczego bez ładowania encji należy użyć ExecuteDeleteAsync (.NET 7+).
// Delete a tracked entity
_db.Products.Remove(product);
await _db.SaveChangesAsync();
// Bulk delete without loading (EF Core 7+)
await _db.Products
.Where(p => p.Stock == 0)
.ExecuteDeleteAsync();Konfigurowanie za pomocą Fluent API
Należy przesłonić metodę OnModelCreating, aby skonfigurować encje za pomocą Fluent API — nazwy tabel, typy kolumn, ograniczenia, indeksy i relacje.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>(entity =>
{
entity.ToTable("products");
entity.Property(p => p.Name).IsRequired().HasMaxLength(200);
entity.Property(p => p.Price).HasColumnType("decimal(18,2)");
entity.HasIndex(p => p.Name);
});
}Praktyczny przykład: repozytorium korzystające z DbContext
Typowe repozytorium opakowuje DbContext, aby scentralizować logikę dostępu do danych i ukryć szczegóły zapytań przed klasami usług.
public class ProductRepository : IProductRepository
{
private readonly AppDbContext _db;
public ProductRepository(AppDbContext db) => _db = db;
public async Task<Product?> GetByIdAsync(int id)
=> await _db.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == id);
public async Task<List<Product>> SearchAsync(string query)
=> await _db.Products
.Where(p => p.Name.Contains(query))
.AsNoTracking()
.ToListAsync();
}Szybkie sprawdzenie
Co robi AsNoTracking() podczas wykonywania zapytań za pomocą EF Core?
Podsumowanie: podstawy DbContext i DbSet
Najważniejsze informacje:
- DbContext to sesja połączenia z bazą danych, a DbSet<T> reprezentuje tabelę
- Należy zarejestrować DbContext za pomocą
AddDbContextw DI; domyślnie ma zakres Scoped - Zapytania LINQ są wykonywane odroczone — należy je wykonać za pomocą
ToListAsynclubFirstOrDefaultAsync - Śledzenie zmian umożliwia automatyczne wykonywanie UPDATE/DELETE za pomocą SaveChangesAsync
- W przypadku zapytań tylko do odczytu należy użyć
AsNoTracking(), aby zwiększyć wydajność
Często zadawane pytania
Czy lekcja „Podstawy DbContext i DbSet” jest bezpłatna?
Tak — pełny tekst „Podstawy DbContext i DbSet” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Podstawy DbContext i DbSet”?
Skonfiguruj DbContext, zdefiniuj encje, ustaw connection string i wykonaj pierwsze zapytanie. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Podstawy DbContext i DbSet”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy DbContext i DbSet
- Migracje i zarządzanie schematem
- Operacje CRUD z EF Core
- Relacje: jeden-do-wielu i wiele-do-wielu