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.
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 automaticallyBanyak-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 FKMenapis 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 deletedEntiti 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
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
- Asas DbContext & DbSet
- Migrasi & Pengurusan Skema
- Operasi CRUD dengan EF Core
- Perhubungan: Satu-ke-Banyak & Banyak-ke-Banyak