DbContextin ja DbSetin perusteet
Määrittäkää DbContext, entiteetit ja yhteysmerkkijono sekä suorittakaa ensimmäinen kyselynne.
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 PKTietueiden 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- taiFirstOrDefaultAsync-metodilla - Muutosten seuranta mahdollistaa automaattiset UPDATE- ja DELETE-toiminnot SaveChangesAsync-metodin avulla
- Käyttäkää
AsNoTracking()-metodia vain lukuun tarkoitettuihin kyselyihin suorituskyvyn parantamiseksi
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
- DbContextin ja DbSetin perusteet
- Migraatiot ja skeeman hallinta
- CRUD-toiminnot EF Corella
- Suhteet: yksi moneen ja moni moneen