Grunnleggende om DbContext og DbSet
Konfigurer en DbContext, definer entiteter, angi tilkoblingsstrengen og kjør din første spørring.
Grunnleggende om DbContext og DbSet er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva er Entity Framework Core?
EF Core er den offisielle objekt-relasjonelle mapperen (ORM) for .NET. Den mapper C#-klasser (entiteter) til databasetabeller og lar man spørre etter og lagre data ved hjelp av LINQ – uten SQL for de fleste operasjoner.
Definere en entitet
En entitet er en vanlig C#-klasse der egenskapene tilsvarer kolonner i databasen. Etter konvensjonen blir en egenskap med navnet Id eller <TypeName>Id primærnøkkelen.
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; }
}Opprette en DbContext
DbContext er inngangsporten til databasen. Den inneholder DbSet<T>-egenskaper for hver entitet og håndterer tilkoblingen, endringssporing og transaksjoner.
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>();
}Registrere DbContext med DI
Kall AddDbContext i Program.cs for å registrere konteksten som en Scoped-tjeneste og konfigurere databaseleverandøren.
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("Default")));
// For SQLite (great for development/testing):
// options.UseSqlite("Data Source=app.db");Grunnleggende spørringer med DbSet
DbSet<T> eksponerer LINQ-operatorer. Spørringer kjøres ikke før de blir enumerert (await ...ToListAsync()). Dette kalles utsatt kjøring.
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();
}
}Finne med primærnøkkel
FindAsync kontrollerer først den lokale hurtigbufferen i endringssporingen før databasen kontaktes. Bruk den ved spørringer på primærnøkkelen for å unngå unødvendige turer til databasen.
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);Legge til nye poster
Kall Add for å legge en entitet i kø for innsetting, og kall deretter SaveChangesAsync for å bekrefte endringen. EF Core genererer INSERT-SQL-en og fyller ut den automatisk genererte Id-verdien.
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 PKOppdatere poster
Entiteter som lastes inn av EF Core, spores. Endre egenskapene direkte og kall SaveChangesAsync — EF Core oppdager endringene og genererer en optimalisert UPDATE-setning.
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=...
}Slette poster
Kall Remove for å merke en entitet for sletting, og kall deretter SaveChangesAsync. Bruk ExecuteDeleteAsync (.NET 7+) for massesletting uten å laste inn entitetene.
// 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();Konfigurere med Fluent API
Overstyr OnModelCreating for å konfigurere entiteter med Fluent API — tabellnavn, kolonnetyper, begrensninger, indekser og relasjoner.
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);
});
}Praktisk eksempel: Repository med DbContext
Et typisk repository pakker inn DbContext for å sentralisere logikken for datatilgang og holde spørringsdetaljer ute av tjenesteklassene.
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();
}Hurtigsjekk
Hva gjør AsNoTracking() når det brukes til spørringer med EF Core?
Oppsummering: Grunnleggende om DbContext og DbSet
Viktigste punkter:
- DbContext er økten mot databasen; DbSet<T> representerer en tabell
- Registrer med
AddDbContexti DI; tjenesten er Scoped som standard - LINQ-spørringer kjøres utsatt — kjør dem med
ToListAsyncellerFirstOrDefaultAsync - Endringssporing muliggjør automatisk UPDATE/DELETE via SaveChangesAsync
- Bruk
AsNoTracking()for skrivebeskyttede spørringer for å forbedre ytelsen
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Grunnleggende om DbContext og DbSet» gratis?
Ja – hele teksten i «Grunnleggende om DbContext og DbSet» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Grunnleggende om DbContext og DbSet»?
Konfigurer en DbContext, definer entiteter, angi tilkoblingsstrengen og kjør din første spørring. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Grunnleggende om DbContext og DbSet»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grunnleggende om DbContext og DbSet
- Migreringer og skjemahåndtering
- CRUD-operasjoner med EF Core
- Relasjoner: én-til-mange og mange-til-mange