C# Academy · Oppitunti

DbContextin ja DbSetin perusteet

Määrittäkää DbContext, entiteetit ja yhteysmerkkijono sekä suorittakaa ensimmäinen kyselynne.

Oppitunti 1/413 vaihetta

DbContextin ja DbSetin perusteet on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mikä Entity Framework Core on

EF Core on virallinen .NET:n olio-relaatiokartoittaja (ORM). Se yhdistää C#-luokat (entiteetit) tietokannan tauluihin ja mahdollistaa tietojen kyselyn ja tallentamisen LINQ:n avulla — useimmissa toiminnoissa SQL:ää ei tarvita.

Entiteetin määrittäminen

Entiteetti on tavallinen C#-luokka, jonka ominaisuudet yhdistyvät tietokannan sarakkeisiin. Ominaisuudesta nimeltä Id tai <TypeName>Id tulee käytännössä automaattisesti perusavain.

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; }
}

DbContextin luominen

DbContext on yhdyskäytävä tietokantaan. Se sisältää kullekin entiteetille DbSet<T>-ominaisuudet ja hallitsee yhteyttä, muutosten seurantaa sekä tapahtumia.

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>();
}

DbContextin rekisteröinti DI:hin

Kutsukaa AddDbContext-metodia tiedostossa Program.cs, jotta konteksti rekisteröidään Scoped-palveluksi ja tietokannan palveluntarjoaja määritetään.

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("Default")));

// For SQLite (great for development/testing):
// options.UseSqlite("Data Source=app.db");

Peruskyselyt DbSetillä

DbSet<T> tarjoaa LINQ-operaattorit. Kyselyitä ei suoriteta ennen niiden läpikäyntiä (await ...ToListAsync()). Tätä kutsutaan viivästetyksi suoritukseksi.

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();
    }
}

Haku perusavaimella

FindAsync tarkistaa ensin paikallisen muutosten seurannan välimuistin ennen tietokantaan tehtävää kyselyä. Käyttäkää sitä perusavaimella haettaessa turhien edestakaisten tietokantapyyntöjen välttämiseksi.

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);

Uusien tietueiden lisääminen

Kutsukaa Add-metodia jonottaaksenne entiteetin lisättäväksi ja vahvistakaa muutos sitten kutsumalla SaveChangesAsync-metodia. EF Core muodostaa INSERT-SQL-lauseen ja täyttää automaattisesti luodun Id-arvon.

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

Tietueiden päivittäminen

EF Coren lataamat entiteetit ovat seurannassa. Muokatkaa ominaisuuksia suoraan ja kutsukaa SaveChangesAsync-metodia — EF Core havaitsee muutokset ja muodostaa optimoidun UPDATE-lauseen.

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=...
}

Tietueiden poistaminen

Kutsukaa Remove-metodia merkitäksenne entiteetin poistettavaksi ja kutsukaa sitten SaveChangesAsync-metodia. Käyttäkää ExecuteDeleteAsync-metodia (.NET 7+) joukkopoistoihin ilman entiteettien lataamista.

// 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();

Määritys Fluent APIlla

Ohittakaa OnModelCreating-metodi entiteettien määrittämiseksi Fluent APIlla — voitte määrittää taulujen nimet, saraketyypit, rajoitteet, indeksit ja suhteet.

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);
    });
}

Käytännössä: DbContextia käyttävä repositorio

Tyypillinen repositorio kapseloi DbContextin keskittääkseen tietojen käyttöön liittyvän logiikan ja pitääkseen kyselyjen yksityiskohdat poissa palveluluokista.

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();
}

Pikatarkistus

Mitä AsNoTracking() tekee EF Corella tehtäessä kyselyä?

Kertaus: DbContextin ja DbSetin perusteet

Keskeiset opit:

  • DbContext on istunto tietokantaan; DbSet<T> edustaa taulua
  • Rekisteröikää DbContext DI:hin AddDbContext-metodilla; palvelun elinkaari on oletusarvoisesti Scoped
  • LINQ-kyselyt ovat viivästettyjä — suorittakaa ne ToListAsync- tai FirstOrDefaultAsync-metodilla
  • Muutosten seuranta mahdollistaa automaattiset UPDATE- ja DELETE-toiminnot SaveChangesAsync-metodin avulla
  • Käyttäkää AsNoTracking()-metodia vain lukuun tarkoitettuihin kyselyihin suorituskyvyn parantamiseksi
Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”DbContextin ja DbSetin perusteet” ilmainen?

Kyllä – oppitunnin ”DbContextin ja DbSetin perusteet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”DbContextin ja DbSetin perusteet”?

Määrittäkää DbContext, entiteetit ja yhteysmerkkijono sekä suorittakaa ensimmäinen kyselynne. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”DbContextin ja DbSetin perusteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. DbContextin ja DbSetin perusteet
  2. Migraatiot ja skeeman hallinta
  3. CRUD-toiminnot EF Corella
  4. Suhteet: yksi moneen ja moni moneen
← Takaisin: C# Academy