C# Academy · leksjon

Grunnleggende om DbContext og DbSet

Konfigurer en DbContext, definer entiteter, angi tilkoblingsstrengen og kjør din første spørring.

Leksjon 1 av 413 trinn

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 PK

Oppdatere 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 AddDbContext i DI; tjenesten er Scoped som standard
  • LINQ-spørringer kjøres utsatt — kjør dem med ToListAsync eller FirstOrDefaultAsync
  • Endringssporing muliggjør automatisk UPDATE/DELETE via SaveChangesAsync
  • Bruk AsNoTracking() for skrivebeskyttede spørringer for å forbedre ytelsen
Gratis å komme i gang

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

  1. Grunnleggende om DbContext og DbSet
  2. Migreringer og skjemahåndtering
  3. CRUD-operasjoner med EF Core
  4. Relasjoner: én-til-mange og mange-til-mange
← Tilbake til C# Academy