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
. Contohnya:
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 dari 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 Post
kamiBlog
:
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 Blogs
Id
kunci utama dirujuk oleh BlogId
kolom kunci asing tabel Posts
. Kolom ini "dibatasi" sehingga nilai apa pun di BlogId
kolom Posts
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 , Blog
Blog.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
. Contohnya:
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:
- Kunci asing dan utama dalam hubungan, yang mencakup bagaimana kunci asing dipetakan ke database.
- Navigasi hubungan, yang menjelaskan bagaimana navigasi berlapis di atas kunci asing untuk memberikan tampilan hubungan yang berorientasi objek.
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
atauSaveChangesAsync
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. Contohnya:
- Hubungan dapat digunakan untuk mengkueri data terkait dengan salah satu dari tiga cara:
-
Dengan bersemangat sebagai bagian dari kueri LINQ, menggunakan
Include
. - Malas menggunakan proksi pemuatan malas, atau pemuatan malas tanpa proksi.
-
Secara eksplisit menggunakan
Load
metode atauLoadAsync
.
-
Dengan bersemangat sebagai bagian dari kueri LINQ, menggunakan
- Hubungan dapat digunakan dalam penyemaian data melalui pencocokan nilai PK dengan nilai FK.
- Hubungan dapat digunakan untuk melacak grafik entitas. Hubungan kemudian digunakan oleh pelacak perubahan untuk:
- Mendeteksi perubahan dalam hubungan dan melakukan perbaikan
-
Mengirim pembaruan kunci asing ke database dengan
SaveChanges
atauSaveChangesAsync