Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Atribut pemetaan digunakan untuk memodifikasi atau mengambil alih konfigurasi yang ditemukan oleh konvensi pembuatan model. Konfigurasi yang dilakukan dengan memetakan atribut dapat diubah oleh API pembuatan model yang digunakan dalam OnModelCreating.
Penting
Dokumen ini hanya mencakup atribut pemetaan dalam konteks konfigurasi hubungan. Penggunaan atribut pemetaan lainnya tercakup dalam bagian yang relevan dari dokumentasi pemodelan yang lebih luas.
Petunjuk / Saran
Kode di bawah ini dapat ditemukan di MappingAttributes.cs.
Tempat mendapatkan atribut pemetaan
Banyak atribut pemetaan berasal dari namespace System.ComponentModel.DataAnnotations dan System.ComponentModel.DataAnnotations.Schema . Atribut dalam namespace layanan ini disertakan sebagai bagian dari kerangka kerja dasar di semua versi .NET yang didukung, sehingga tidak memerlukan penginstalan paket NuGet tambahan apa pun. Atribut pemetaan ini biasanya disebut "anotasi data" dan digunakan oleh berbagai kerangka kerja, termasuk EF Core, EF6, ASP.NET Core MVC, dan sebagainya. Mereka juga digunakan untuk validasi.
Penggunaan anotasi data di banyak teknologi dan untuk pemetaan dan validasi telah menyebabkan perbedaan semantik di seluruh teknologi. Semua atribut pemetaan baru yang dirancang untuk EF Core sekarang khusus untuk EF Core, sehingga semantik dan penggunaannya tetap sederhana dan jelas. Atribut ini terkandung dalam paket NuGet Microsoft.EntityFrameworkCore.Abstractions . Paket ini disertakan sebagai dependensi setiap kali paket Microsoft.EntityFrameworkCore utama, atau salah satu paket penyedia database terkait, digunakan. Namun, paket Abstractions adalah paket ringan yang dapat dirujuk langsung oleh kode aplikasi tanpa membawa semua EF Core dan dependensinya.
AtributDiperlukan
RequiredAttribute diterapkan ke properti untuk menunjukkan bahwa properti tidak boleh null. Dalam konteks hubungan, [Required] biasanya digunakan pada properti kunci asing. Melakukannya membuat kunci asing tidak dapat diubah ke null, sehingga membuat hubungan diperlukan. Misalnya, dengan jenis berikut, properti Post.BlogId dibuat non-nullable, dan hubungan menjadi wajib.
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public string BlogId { get; set; }
public Blog Blog { get; init; }
}
Catatan
Saat menggunakan C# nullable reference types, BlogId properti dalam contoh ini sudah non-nullable, yang berarti [Required] atribut tersebut tidak akan berpengaruh.
[Required] yang ditempatkan pada navigasi dependen memiliki efek yang sama. Artinya, membuat kunci asing tidak bisa bernilai null, dan dengan demikian membuat hubungan menjadi wajib. Contohnya:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogId { get; set; }
[Required]
public Blog Blog { get; init; }
}
Jika [Required] ditemukan pada navigasi dependen dan properti kunci asing dalam keadaan tersembunyi, maka properti tersembunyi dijadikan tidak dapat bernilai null, menjadikan hubungan tersebut bersifat wajib. Contohnya:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public Blog Blog { get; init; }
}
Catatan
Menggunakan [Required] pada sisi navigasi utama dari suatu hubungan tidak berpengaruh.
ForeignKeyAttribute
ForeignKeyAttribute digunakan untuk menyambungkan properti kunci asing dengan navigasinya.
[ForeignKey] dapat ditempatkan pada properti kunci asing dengan nama dari navigasi yang bergantung. Contohnya:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey(nameof(Blog))]
public string BlogKey { get; set; }
public Blog Blog { get; init; }
}
Atau, [ForeignKey] dapat ditempatkan pada navigasi dependen atau utama dengan nama properti yang digunakan sebagai kunci asing. Contohnya:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogKey { get; set; }
[ForeignKey(nameof(BlogKey))]
public Blog Blog { get; init; }
}
Ketika [ForeignKey] ditempatkan pada navigasi dan nama yang disediakan tidak cocok dengan nama properti apa pun, maka properti bayangan dengan nama tersebut akan dibuat untuk bertindak sebagai kunci asing. Contohnya:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey("BlogKey")]
public Blog Blog { get; init; }
}
InversePropertyAttribute
InversePropertyAttribute digunakan untuk menyambungkan navigasi dengan inversinya. Misalnya, dalam jenis entitas berikut, ada dua hubungan antara Blog dan Post. Tanpa konfigurasi apa pun, konvensi EF tidak dapat menentukan navigasi mana di antara kedua jenis yang harus dipasangkan. Menambahkan [InverseProperty] ke salah satu navigasi yang berpasangan menyelesaikan ambiguitas ini dan memungkinkan EF membangun model.
public class Blog
{
public int Id { get; set; }
[InverseProperty("Blog")]
public List<Post> Posts { get; } = new();
public int FeaturedPostId { get; set; }
public Post FeaturedPost { get; set; }
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; init; }
}
Penting
[InverseProperty] hanya diperlukan ketika ada lebih dari satu hubungan antara jenis yang sama. Dalam satu relasi, kedua navigasi dipasangkan secara otomatis.
DeleteBehaviorAttribute
Menurut konvensi, EF menggunakan ClientSetNullDeleteBehavior untuk hubungan opsional, dan Cascade perilaku untuk hubungan yang diperlukan. Ini dapat diubah dengan menempatkan DeleteBehaviorAttribute pada salah satu navigasi hubungan. Contohnya:
public class Blog
{
public int Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
[DeleteBehavior(DeleteBehavior.Restrict)]
public Blog Blog { get; init; }
}
Lihat Penghapusan cascade untuk informasi selengkapnya tentang perilaku pencascadingan.