Akademi C# · Pelajaran

Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak

Modelkan dan buat pertanyaan untuk perhubungan satu-ke-banyak dan banyak-ke-banyak dengan sifat navigasi serta Fluent API.

Pelajaran 4 daripada 413 langkah

Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Perhubungan dalam EF Core

EF Core memodelkan tiga jenis perhubungan antara entiti: satu-ke-satu, satu-ke-banyak dan banyak-ke-banyak. Setiap satunya dinyatakan dengan sifat navigasi dan boleh dikonfigurasi menggunakan API Fluent.

Satu-ke-Banyak: Penyediaan Entiti

Satu Blog mempunyai banyak Post. Entiti tanggungan (Post) menyimpan kunci asing. Sifat navigasi pada kedua-dua belah membolehkan pergerakan dalam mana-mana arah.

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 membuat kesimpulan tentang perhubungan mengikut konvensyen, tetapi anda boleh menyatakannya secara jelas dengan API Fluent untuk kejelasan dan menetapkan tingkah laku pemadaman 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);
}

Membuat Pertanyaan dengan Include (Pemuatan Awal)

Gunakan Include untuk memuatkan data berkaitan dalam pertanyaan yang sama. Gunakan ThenInclude untuk pergi lebih jauh dalam graf navigasi.

// 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 Entiti Penyambung

EF Core 5+ menyokong perhubungan banyak-ke-banyak tanpa entiti penyambung yang jelas. Ia mencipta jadual penyambung secara automatik menggunakan nama jenis entiti.

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 Entiti Penyambung

Apabila jadual penyambung memerlukan lajur tambahan (contohnya, tarikh pendaftaran dan gred), cipta entiti penyambung yang jelas dengan kunci utama komposit.

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 Berkaitan

Tambah entiti berkaitan pada koleksi induk sebelum memanggil SaveChangesAsync. EF Core mengendalikan nilai FK secara automatik.

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

Menapis Data Berkaitan

Anda boleh menapis sifat navigasi dalam LINQ. EF Core menterjemahkannya kepada operasi JOIN secara automatik.

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

Pemadaman Berantai

Dengan DeleteBehavior.Cascade, pemadaman entiti utama (Blog) secara automatik memadam semua entiti tanggungan (Post). Pilihan lain: 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

Entiti Milik untuk Objek Nilai

Jenis entiti milik sangat sesuai untuk objek nilai (contohnya, Address). Entiti ini disimpan dalam jadual yang sama dengan pemiliknya dan tidak mempunyai identiti tersendiri.

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

Situasi Sebenar: Pesanan dengan Item Baris

Corak e-dagang lengkap: Order (entiti utama) dengan banyak OrderLines (entiti tanggungan), setiap satunya merujuk kepada 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);

Semakan Pantas

Bilakah EF Core mencipta jadual penyambung secara automatik tanpa entiti penyambung yang jelas?

Kesimpulan: Perhubungan dalam EF Core

Kesimpulan utama:

  • Satu-ke-banyak: FK pada entiti tanggungan; navigasi pada kedua-dua belah; gunakan Include untuk memuatkan data
  • Banyak-ke-banyak (ringkas): dua navigasi ICollection — EF Core mencipta jadual penyambung secara automatik
  • Banyak-ke-banyak (dengan muatan): entiti penyambung yang jelas dengan PK komposit
  • Pemadaman berantai mengawal perkara yang berlaku kepada entiti tanggungan apabila entiti utama dialih keluar
  • Entiti milik memodelkan objek nilai dalam jadual yang sama dengan pemiliknya
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak” percuma?

Ya — teks penuh “Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak”?

Modelkan dan buat pertanyaan untuk perhubungan satu-ke-banyak dan banyak-ke-banyak dengan sifat navigasi serta Fluent API. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas DbContext & DbSet
  2. Migrasi & Pengurusan Skema
  3. Operasi CRUD dengan EF Core
  4. Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak
← Kembali ke Akademi C#