0Pricing
C# Academy · Pelajaran

Relasi: Satu-ke-Banyak & Banyak-ke-Banyak

Modelkan dan kueri relasi satu-ke-banyak serta banyak-ke-banyak dengan properti navigasi dan Fluent API.

Relasi: Satu-ke-Banyak & Banyak-ke-Banyak adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Relasi dalam EF Core

EF Core memodelkan tiga jenis relasi antarentitas: satu-ke-satu, satu-ke-banyak, dan banyak-ke-banyak. Masing-masing dinyatakan dengan properti navigasi dan, jika diperlukan, dikonfigurasi menggunakan API Fluent.

Satu-ke-Banyak: Penyiapan Entitas

Blog memiliki banyak Post. Entitas dependen (Post) menyimpan kunci asing. Properti navigasi di kedua sisi memungkinkan penelusuran ke arah mana pun.

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public ICollection<Post> Posts { get; set; } = new List<Post>();
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public int BlogId { get; set; }        // FK
    public Blog Blog { get; set; } = null!; // nav property
}

API Fluent: Satu-ke-Banyak

EF Core menyimpulkan relasi berdasarkan konvensi, tetapi Anda dapat menyatakannya secara eksplisit dengan API Fluent agar lebih jelas dan untuk mengatur perilaku penghapusan berantai.

protected override void OnModelCreating(ModelBuilder mb)
{
    mb.Entity<Blog>()
      .HasMany(b => b.Posts)
      .WithOne(p => p.Blog)
      .HasForeignKey(p => p.BlogId)
      .OnDelete(DeleteBehavior.Cascade);
}

Melakukan Kueri dengan Include (Pemuatan Langsung)

Gunakan Include untuk memuat data terkait dalam kueri yang sama. Gunakan ThenInclude untuk menelusuri graf navigasi lebih dalam.

// Load blog with all its posts
var blog = await _db.Blogs
    .Include(b => b.Posts)
    .FirstOrDefaultAsync(b => b.Id == 1);

// Load posts with their comments too
var blogs = await _db.Blogs
    .Include(b => b.Posts)
        .ThenInclude(p => p.Comments)
    .ToListAsync();

Banyak-ke-Banyak Tanpa Entitas Penghubung

EF Core 5+ mendukung relasi banyak-ke-banyak tanpa entitas penghubung eksplisit. EF Core membuat tabel penghubung secara otomatis menggunakan nama tipe entitas.

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public ICollection<Course> Courses { get; set; } = new List<Course>();
}

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public ICollection<Student> Students { get; set; } = new List<Student>();
}
// EF creates StudentCourse join table automatically

Banyak-ke-Banyak dengan Entitas Penghubung

Jika tabel penghubung memerlukan kolom tambahan (misalnya, tanggal pendaftaran dan nilai), buat entitas penghubung eksplisit dengan kunci utama gabungan.

public class Enrollment
{
    public int StudentId { get; set; }
    public Student Student { get; set; } = null!;
    public int CourseId { get; set; }
    public Course Course { get; set; } = null!;
    public DateTime EnrolledAt { get; set; }
    public decimal? Grade { get; set; }
}

// Fluent API config:
mb.Entity<Enrollment>().HasKey(e => new { e.StudentId, e.CourseId });
mb.Entity<Enrollment>().HasOne(e => e.Student).WithMany(s => s.Enrollments);
mb.Entity<Enrollment>().HasOne(e => e.Course).WithMany(c => c.Enrollments);

Menyisipkan Data Terkait

Tambahkan entitas terkait ke koleksi milik induk sebelum memanggil SaveChangesAsync. EF Core menangani nilai FK secara otomatis.

var blog = new Blog { Name = "Dev Notes" };
blog.Posts.Add(new Post { Title = "Hello EF Core" });
blog.Posts.Add(new Post { Title = "Migrations Deep Dive" });

_db.Blogs.Add(blog);
await _db.SaveChangesAsync();
// Inserts Blog + 2 Posts with correct BlogId FK

Memfilter Data Terkait

Anda dapat memfilter properti navigasi dalam LINQ. EF Core menerjemahkannya menjadi SQL JOIN secara otomatis.

// Blogs that have at least one published post
var popularBlogs = await _db.Blogs
    .Where(b => b.Posts.Any(p => p.IsPublished))
    .Select(b => new { b.Name, PostCount = b.Posts.Count(p => p.IsPublished) })
    .OrderByDescending(b => b.PostCount)
    .ToListAsync();

Penghapusan Berantai

Dengan DeleteBehavior.Cascade, menghapus entitas utama (Blog) secara otomatis menghapus semua entitas dependen (Post). Pilihan lainnya: SetNull, Restrict, NoAction.

// Delete a blog and all its posts
var blog = await _db.Blogs.FindAsync(1);
_db.Blogs.Remove(blog!);
await _db.SaveChangesAsync();
// Cascade: all Posts with BlogId=1 are also deleted

Entitas Milik untuk Objek Nilai

Tipe entitas milik sangat cocok untuk objek nilai (misalnya, Address). Entitas ini disimpan dalam tabel yang sama dengan pemiliknya dan tidak memiliki identitas mandiri.

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public Address ShippingAddress { get; set; } = new();
}

public class Address
{
    public string Street { get; set; } = "";
    public string City { get; set; } = "";
    public string Country { get; set; } = "";
}

// Fluent API:
mb.Entity<Customer>().OwnsOne(c => c.ShippingAddress);

Dunia Nyata: Pesanan dengan Item Baris

Pola perdagangan elektronik lengkap: Pesanan (entitas utama) dengan banyak OrderLines (entitas dependen), yang masing-masing merujuk ke Product.

var order = await _db.Orders
    .Include(o => o.Lines)
        .ThenInclude(l => l.Product)
    .FirstOrDefaultAsync(o => o.Id == orderId);

if (order is null) return Results.NotFound();

var summary = new
{
    OrderId = order.Id,
    Total   = order.Lines.Sum(l => l.Quantity * l.Product.Price),
    Items   = order.Lines.Select(l => new
    {
        l.Product.Name,
        l.Quantity,
        LineTotal = l.Quantity * l.Product.Price
    })
};
return Results.Ok(summary);

Pemeriksaan Singkat

Kapan EF Core membuat tabel penghubung secara otomatis tanpa entitas penghubung eksplisit?

Ringkasan: Relasi dalam EF Core

Poin penting:

  • Satu-ke-banyak: FK berada pada entitas dependen; navigasi berada di kedua sisi; gunakan Include untuk memuat data
  • Banyak-ke-banyak (sederhana): dua navigasi ICollection — EF Core membuat tabel penghubung secara otomatis
  • Banyak-ke-banyak (dengan data tambahan): entitas penghubung eksplisit dengan PK gabungan
  • Penghapusan berantai mengatur apa yang terjadi pada entitas dependen saat entitas utama dihapus
  • Entitas milik memodelkan objek nilai dalam tabel yang sama dengan pemiliknya

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Relasi: Satu-ke-Banyak & Banyak-ke-Banyak” gratis?

Ya — teks lengkap “Relasi: Satu-ke-Banyak & Banyak-ke-Banyak” 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 “Relasi: Satu-ke-Banyak & Banyak-ke-Banyak”?

Modelkan dan kueri relasi satu-ke-banyak serta banyak-ke-banyak dengan properti navigasi dan Fluent API. 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 4 dari 4.

Berapa lama pelajaran “Relasi: Satu-ke-Banyak & Banyak-ke-Banyak” 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