C# Academy · Pelajaran

Operasi CRUD dengan EF Core

Lakukan operasi Create, Read, Update, dan Delete menggunakan pelacakan perubahan EF Core dan SaveChanges.

Pelajaran 3 dari 413 langkah

Operasi CRUD dengan EF Core adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Gambaran Umum CRUD di EF Core

EF Core menangani keempat operasi CRUD — Buat, Baca, Perbarui, Hapus — melalui kombinasi pelacakan perubahan dan SaveChangesAsync(). Memahami pelacak perubahan adalah kunci untuk menguasai CRUD.

Buat: Menambahkan Entitas Baru

Gunakan DbSet.Add() atau AddAsync() untuk menandai entitas sebagai Ditambahkan. Saat SaveChangesAsync() dipanggil, EF Core menghasilkan INSERT dan mengisi kunci kenaikan otomatis.

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

Menambahkan Graf Entitas

Menambahkan induk beserta anak-anaknya dalam satu panggilan akan menyisipkan seluruh graf objek. EF Core menyelesaikan relasi FK secara otomatis.

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

Baca: Melakukan Kueri dengan LINQ

EF Core menerjemahkan ekspresi LINQ menjadi SQL. Susun kueri menggunakan Where, Select, OrderBy, dan sebagainya, lalu wujudkan hasilnya dengan ToListAsync atau FirstOrDefaultAsync.

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

Baca: Pencarian Satu Entitas

Untuk membaca satu entitas, gunakan FindAsync (memeriksa pelacak terlebih dahulu) atau FirstOrDefaultAsync / SingleOrDefaultAsync dengan predikat.

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

Perbarui: Pelacakan Perubahan

Entitas yang dimuat melalui EF Core dilacak. Ubah properti secara langsung dan panggil SaveChangesAsync(). EF Core mendeteksi perbedaannya dan menghasilkan pernyataan UPDATE minimal.

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

Perbarui: Pembaruan Massal (EF Core 7+)

ExecuteUpdateAsync memperbarui baris secara langsung dalam basis data tanpa memuat entitas. Cara ini jauh lebih efisien untuk operasi massal.

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

Hapus: Menghapus Satu Entitas

Panggil Remove() pada entitas yang dilacak, lalu panggil SaveChangesAsync(). Jika Anda hanya memiliki ID, cari entitas tersebut terlebih dahulu atau gunakan ExecuteDeleteAsync.

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

Hapus: Penghapusan Massal (EF Core 7+)

ExecuteDeleteAsync mengeluarkan satu pernyataan SQL DELETE tanpa memuat entitas — ideal untuk operasi pembersihan secara berkelompok.

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

Transaksi

Semua operasi dalam satu panggilan SaveChangesAsync dibungkus dalam sebuah transaksi. Untuk operasi bertahap yang mencakup beberapa penyimpanan, gunakan transaksi eksplisit.

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

Dunia Nyata: Layanan CRUD Lengkap

Layanan lengkap membungkus semua operasi CRUD dengan penanganan kesalahan yang tepat dan mengembalikan objek transfer data untuk menghindari pemaparan detail internal entitas.

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

Pemeriksaan Singkat

Apa keunggulan ExecuteUpdateAsync / ExecuteDeleteAsync dibandingkan memuat entitas lalu memanggil SaveChangesAsync?

Ringkasan: Operasi CRUD dengan EF Core

Key takeaways:

  • Add + SaveChangesAsync → INSERT; EF Core populates auto-generated keys
  • Modify tracked entities + SaveChangesAsync → minimal UPDATE
  • Remove + SaveChangesAsync → DELETE for single entities
  • ExecuteUpdateAsync / ExecuteDeleteAsync → bulk operations without loading (EF Core 7+)
  • Wrap multi-step operations in an explicit transaction for atomicity
Gratis untuk memulai

Belajar C# dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
93
Pelajaran
346

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Operasi CRUD dengan EF Core” gratis?

Ya — teks lengkap “Operasi CRUD dengan EF Core” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Operasi CRUD dengan EF Core”?

Lakukan operasi Create, Read, Update, dan Delete menggunakan pelacakan perubahan EF Core dan SaveChanges. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Operasi CRUD dengan EF Core” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar DbContext & DbSet
  2. Migrasi & Pengelolaan Skema
  3. Operasi CRUD dengan EF Core
  4. Relasi: Satu-ke-Banyak & Banyak-ke-Banyak
← Kembali ke C# Academy