C# Academy · Oppitunti

CRUD-toiminnot EF Corella

Suorittakaa Create-, Read-, Update- ja Delete-toimintoja EF Coren muutosseurannan ja SaveChangesin avulla.

Oppitunti 3/413 vaihetta

CRUD-toiminnot EF Corella on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

EF Coren CRUD-toimintojen yleiskatsaus

EF Core käsittelee kaikki neljä CRUD-toimintoa — luomisen, lukemisen, päivittämisen ja poistamisen — muutosten seurannan ja SaveChangesAsync()-metodin yhdistelmällä. Muutosten seurannan ymmärtäminen on avain CRUD-toimintojen hallintaan.

Luominen: uuden entiteetin lisääminen

Käyttäkää DbSet.Add()- tai AddAsync()-metodia merkitäksenne entiteetin Added-tilaan. Kun kutsutte SaveChangesAsync()-metodia, EF Core muodostaa INSERT-lauseen ja täyttää automaattisesti kasvavan avaimen.

var order = new Order
{
    CustomerId = 5,
    PlacedAt   = DateTime.UtcNow,
    Status     = OrderStatus.Pending
};

await _db.Orders.AddAsync(order);
await _db.SaveChangesAsync();

Console.WriteLine(order.Id); // populated by DB

Entiteettikaavion lisääminen

Kun lisäätte pääentiteetin alientiteetteineen yhdellä kutsulla, koko oliohierarkia lisätään. EF Core määrittää vierasavainten suhteet automaattisesti.

var order = new Order
{
    CustomerId = 5,
    PlacedAt   = DateTime.UtcNow,
    Lines      = new List<OrderLine>
    {
        new() { ProductId = 10, Quantity = 2, Price = 49.99m },
        new() { ProductId = 11, Quantity = 1, Price = 19.99m }
    }
};

_db.Orders.Add(order);
await _db.SaveChangesAsync();
// Inserts Order + 2 OrderLines in one transaction

Lukeminen: kyselyt LINQilla

EF Core muuntaa LINQ-lausekkeet SQL:ksi. Koostakaa kyselyitä Where-, Select-, OrderBy- ja muilla operaattoreilla ja muodostakaa tulokset sitten ToListAsync- tai FirstOrDefaultAsync-metodilla.

// Read all pending orders for a customer
var orders = await _db.Orders
    .Where(o => o.CustomerId == 5 && o.Status == OrderStatus.Pending)
    .OrderByDescending(o => o.PlacedAt)
    .Select(o => new OrderSummaryDto
    {
        Id     = o.Id,
        Total  = o.Lines.Sum(l => l.Quantity * l.Price),
        Status = o.Status.ToString()
    })
    .ToListAsync();

Lukeminen: yksittäisten entiteettien haut

Kun luette yksittäisen entiteetin, käyttäkää FindAsync-metodia (tarkistaa ensin muutosten seurannan) tai FirstOrDefaultAsync- ja SingleOrDefaultAsync-metodia predikaatin kanssa.

// By PK (checks cache first)
var order = await _db.Orders.FindAsync(orderId);

// By predicate (always hits DB)
var latest = await _db.Orders
    .Where(o => o.CustomerId == 5)
    .OrderByDescending(o => o.PlacedAt)
    .FirstOrDefaultAsync();

Päivittäminen: muutosten seuranta

EF Coren kautta ladatut entiteetit ovat seurannassa. Muokatkaa ominaisuuksia suoraan ja kutsukaa SaveChangesAsync()-metodia. EF Core havaitsee erot ja muodostaa mahdollisimman suppean UPDATE-lauseen.

var order = await _db.Orders.FindAsync(orderId);
if (order is null) return;

order.Status   = OrderStatus.Shipped;
order.ShippedAt = DateTime.UtcNow;

await _db.SaveChangesAsync();
// UPDATE Orders SET Status=..., ShippedAt=... WHERE Id=orderId

Päivittäminen: joukkopäivitys (EF Core 7+)

ExecuteUpdateAsync päivittää rivit suoraan tietokannassa ilman entiteettien lataamista. Se on huomattavasti tehokkaampi joukkotoiminnoissa.

// Mark all overdue orders as Cancelled — no loading needed
await _db.Orders
    .Where(o => o.Status == OrderStatus.Pending
             && o.PlacedAt < DateTime.UtcNow.AddDays(-30))
    .ExecuteUpdateAsync(set => set
        .SetProperty(o => o.Status, OrderStatus.Cancelled)
        .SetProperty(o => o.UpdatedAt, DateTime.UtcNow));

Poistaminen: yksittäisen entiteetin poistaminen

Kutsukaa seuratulle entiteetille Remove()-metodia ja sitten SaveChangesAsync()-metodia. Jos käytettävissänne on vain tunnus, hakekaa entiteetti ensin tai käyttäkää ExecuteDeleteAsync-metodia.

var order = await _db.Orders.FindAsync(orderId);
if (order is null) return;

_db.Orders.Remove(order);
await _db.SaveChangesAsync();
// DELETE FROM Orders WHERE Id=orderId

Poistaminen: joukkopoisto (EF Core 7+)

ExecuteDeleteAsync suorittaa yhden DELETE-SQL-lauseen ilman entiteettien lataamista — se sopii erinomaisesti eräsiivoustoimintoihin.

// Delete all cancelled orders older than 1 year
int deleted = await _db.Orders
    .Where(o => o.Status == OrderStatus.Cancelled
             && o.PlacedAt < DateTime.UtcNow.AddYears(-1))
    .ExecuteDeleteAsync();

Console.WriteLine($"Deleted {deleted} old orders");

Transaktiot

Kaikki yhden SaveChangesAsync-kutsun sisältämät toiminnot suoritetaan transaktion sisällä. Käyttäkää erillistä transaktiota monivaiheisiin toimintoihin, jotka sisältävät useita tallennuksia.

using var transaction = await _db.Database.BeginTransactionAsync();
try
{
    _db.Orders.Add(newOrder);
    await _db.SaveChangesAsync();

    inventory.Stock -= newOrder.Quantity;
    await _db.SaveChangesAsync();

    await transaction.CommitAsync();
}
catch
{
    await transaction.RollbackAsync();
    throw;
}

Käytännössä: täydellinen CRUD-palvelu

Täydellinen palvelu kapseloi kaikki CRUD-toiminnot asianmukaisella virheenkäsittelyllä ja palauttaa DTO-olioita, jotta entiteettien sisäiset yksityiskohdat eivät paljastu.

public async Task<OrderDto> CreateOrderAsync(CreateOrderRequest req)
{
    var order = new Order { CustomerId = req.CustomerId, PlacedAt = DateTime.UtcNow };
    _db.Orders.Add(order);
    await _db.SaveChangesAsync();
    return new OrderDto { Id = order.Id, Status = order.Status.ToString() };
}

public async Task<bool> CancelOrderAsync(int id)
{
    int rows = await _db.Orders
        .Where(o => o.Id == id && o.Status == OrderStatus.Pending)
        .ExecuteUpdateAsync(s =>
            s.SetProperty(o => o.Status, OrderStatus.Cancelled));
    return rows > 0;
}

Pikatarkistus

Mikä etu ExecuteUpdateAsync- ja ExecuteDeleteAsync-metodeilla on verrattuna entiteettien lataamiseen ja SaveChangesAsync-metodin kutsumiseen?

Kertaus: CRUD-toiminnot EF Corella

Keskeiset opit:

  • Add + SaveChangesAsync → INSERT; EF Core täyttää automaattisesti luodut avaimet
  • Seurattujen entiteettien muokkaus + SaveChangesAsync → mahdollisimman suppea UPDATE
  • Remove + SaveChangesAsync → DELETE yksittäisille entiteeteille
  • ExecuteUpdateAsync / ExecuteDeleteAsync → joukkotoiminnot ilman lataamista (EF Core 7+)
  • Koostakaa monivaiheiset toiminnot erillisen transaktion sisään atomisuuden varmistamiseksi
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 ”CRUD-toiminnot EF Corella” ilmainen?

Kyllä – oppitunnin ”CRUD-toiminnot EF Corella” 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 ”CRUD-toiminnot EF Corella”?

Suorittakaa Create-, Read-, Update- ja Delete-toimintoja EF Coren muutosseurannan ja SaveChangesin avulla. 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 3/4.

Kuinka kauan ”CRUD-toiminnot EF Corella”-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