Pengantar hubungan

Dokumen ini menyediakan pengenalan sederhana tentang representasi hubungan dalam model objek dan database relasional, termasuk bagaimana EF Core memetakan antara keduanya.

Hubungan dalam model objek

Hubungan mendefinisikan bagaimana dua entitas berhubungan satu sama lain. Misalnya, ketika memodelkan posting di blog, setiap posting terkait dengan blog yang diterbitkannya, dan blog terkait dengan semua posting yang diterbitkan di blog tersebut.

Dalam bahasa berorientasi objek seperti C#, blog dan posting biasanya diwakili oleh dua kelas: Blog dan Post. Misalnya:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }
}
public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }
}

Pada kelas di atas, tidak ada yang menunjukkan bahwa Blog dan Post terkait. Ini dapat ditambahkan ke model objek dengan menambahkan referensi dari Post tempatnya Blog diterbitkan:

public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateOnly PublishedOn { get; set; }
    public bool Archived { get; set; }

    public Blog Blog { get; set; }
}

Demikian juga, arah yang berlawanan dari hubungan yang sama dapat diwakili sebagai kumpulan Post objek pada masing-masing Blog:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}

Koneksi ini dari Blog ke Post dan, secara terbalik, dari Post belakang ke Blog dikenal sebagai "hubungan" di EF Core.

Penting

Hubungan tunggal biasanya dapat dilalui ke kedua arah. Dalam contoh ini, yaitu dari Blog ke Post melalui Blog.Posts properti , dan dari Post belakang ke Blog melalui Post.Blog properti . Ini adalah satu hubungan, bukan dua.

Tip

Di EF Core, Blog.Posts properti dan Post.Blog disebut "navigasi".

Hubungan dalam database relasional

Database relasional mewakili hubungan menggunakan kunci asing. Misalnya, menggunakan SQL Server atau Azure SQL, tabel berikut dapat digunakan untuk mewakili kelas dan Blog kamiPost:

CREATE TABLE [Posts] (
    [Id] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [PublishedOn] datetime2 NOT NULL,
    [Archived] bit NOT NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE);

CREATE TABLE [Blogs] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [SiteUri] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));

Dalam model relasional ini, Posts tabel dan Blogs masing-masing diberi kolom "kunci primer". Nilai kunci utama secara unik mengidentifikasi setiap posting atau blog. Selain itu, Posts tabel diberi kolom "kunci asing". Kolom BlogsId kunci utama dirujuk oleh BlogId kolom kunci asing tabel Posts . Kolom ini "dibatasi" sehingga nilai apa pun di BlogId kolomPosts harus cocok dengan nilai di Id kolom Blogs. Kecocokan ini menentukan blog mana yang terkait dengan setiap postingan. Misalnya, jika BlogId nilai dalam satu baris Posts tabel adalah 7, maka posting yang diwakili oleh baris tersebut diterbitkan di blog dengan kunci utama 7.

Memetakan hubungan di EF Core

Pemetaan hubungan EF Core adalah tentang memetakan representasi kunci utama/kunci asing yang digunakan dalam database relasional ke referensi antara objek yang digunakan dalam model objek.

Dalam arti yang paling mendasar, ini melibatkan:

  • Menambahkan properti kunci utama ke setiap jenis entitas.
  • Menambahkan properti kunci asing ke satu jenis entitas.
  • Mengaitkan referensi antara jenis entitas dengan kunci utama dan asing untuk membentuk konfigurasi hubungan tunggal.

Setelah pemetaan ini dibuat, EF mengubah nilai kunci asing sesuai kebutuhan ketika referensi antara objek berubah, dan mengubah referensi antara objek sesuai kebutuhan ketika nilai kunci asing berubah.

Catatan

Kunci primer digunakan untuk lebih dari hubungan pemetaan. Lihat Kunci untuk informasi selengkapnya.

Misalnya, jenis entitas yang ditunjukkan di atas dapat diperbarui dengan properti kunci primer dan asing:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}
public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Tip

Properti kunci primer dan asing tidak perlu terlihat secara publik properti dari jenis entitas. Namun, bahkan ketika properti disembunyikan, penting untuk mengenali bahwa properti tersebut masih ada dalam model EF.

Properti kunci utama , BlogBlog.Id, dan properti kunci asing dari Post, Post.BlogId, kemudian dapat dikaitkan dengan referensi ("navigasi") antara jenis entitas (Blog.Posts dan Post.Blog). Ini dilakukan secara otomatis oleh EF ketika membangun hubungan sederhana seperti ini, tetapi juga dapat ditentukan secara eksplisit saat mengambil alih OnModelCreating metode Anda DbContext. Misalnya:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasMany(e => e.Posts)
        .WithOne(e => e.Blog)
        .HasForeignKey(e => e.BlogId)
        .HasPrincipalKey(e => e.Id);
}

Sekarang semua properti ini akan berulah secara koheren bersama-sama sebagai representasi hubungan tunggal antara Blog dan Post.

Cari tahu lebih lanjut

EF mendukung berbagai jenis hubungan, dengan berbagai cara hubungan ini dapat diwakili dan dikonfigurasi. Untuk melompat ke contoh untuk berbagai jenis hubungan, lihat:

  • Hubungan satu ke banyak, di mana satu entitas dikaitkan dengan sejumlah entitas lain.
  • Hubungan satu ke satu, di mana satu entitas dikaitkan dengan entitas tunggal lainnya.
  • Hubungan banyak ke banyak, di mana sejumlah entitas dikaitkan dengan sejumlah entitas lain.

Jika Anda baru mengenal EF, maka mencoba contoh yang ditautkan dalam poin poin di atas adalah cara yang baik untuk merasakan cara kerja hubungan.

Untuk menggali lebih dalam properti jenis entitas yang terlibat dalam pemetaan hubungan, lihat:

Model EF dibangun menggunakan kombinasi tiga mekanisme: konvensi, atribut pemetaan, dan API pembuat model. Sebagian besar contoh menunjukkan API pembuatan model. Untuk mengetahui selengkapnya tentang opsi lain, lihat:

  • Konvensi hubungan, yang menemukan jenis entitas, propertinya, dan hubungan antara jenis.
  • Atribut pemetaan hubungan, yang dapat digunakan sebagai alternatif untuk api pembuatan model untuk beberapa aspek konfigurasi hubungan.

Penting

API pembuatan model adalah sumber akhir kebenaran untuk model EF --selalu diutamakan daripada konfigurasi yang ditemukan oleh konvensi atau ditentukan oleh atribut pemetaan. Ini juga merupakan satu-satunya mekanisme dengan keakuratan penuh untuk mengonfigurasi setiap aspek model EF.

Topik lain yang terkait dengan hubungan meliputi:

  • Penghapusan bertingkat, yang menjelaskan bagaimana entitas terkait dapat dihapus secara otomatis saat SaveChanges atau SaveChangesAsync dipanggil.
  • Jenis entitas yang dimiliki menggunakan jenis khusus hubungan "pemilik" yang menyiratkan koneksi yang lebih kuat antara dua jenis daripada hubungan "normal" yang dibahas di sini. Banyak konsep yang dijelaskan di sini untuk hubungan normal dibawa ke hubungan yang dimiliki. Namun, hubungan yang dimiliki juga memiliki perilaku khusus mereka sendiri.

Tip

Lihat glosarium istilah hubungan sesuai kebutuhan saat membaca dokumentasi untuk membantu memahami terminologi yang digunakan.

Menggunakan hubungan

Hubungan yang ditentukan dalam model dapat digunakan dengan berbagai cara. Misalnya: