Bagikan melalui


Atribut pemetaan (alias anotasi data) untuk hubungan

Atribut pemetaan digunakan untuk memodifikasi atau mengambil alih konfigurasi yang ditemukan oleh konvensi pembuatan model. Konfigurasi yang dilakukan dengan memetakan atribut dapat dengan sendirinya ditimpa 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.

Tip

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 menjaga semantik mereka dan menggunakan 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 Abstraksi adalah paket ringan yang dapat dirujuk langsung oleh kode aplikasi tanpa membawa semua EF Core dan dependensinya.

RequiredAttribute

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, Post.BlogId properti dibuat tidak dapat diubah ke null, dan hubungan menjadi diperlukan.

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 jenis referensi C# nullable, BlogId properti dalam contoh ini sudah tidak dapat diubah ke null, yang berarti [Required] atribut tidak akan berpengaruh.

[Required] ditempatkan pada navigasi dependen memiliki efek yang sama. Artinya, membuat kunci asing tidak dapat diubah ke null, dan dengan demikian membuat hubungan diperlukan. 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 bayangan, maka properti bayangan dibuat tidak dapat diubah ke null, sehingga membuat hubungan diperlukan. Contoh:

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] di sisi navigasi utama hubungan tidak berpengaruh.

ForeignKeyAttribute

ForeignKeyAttribute digunakan untuk menyambungkan properti kunci asing dengan navigasinya. [ForeignKey] dapat ditempatkan pada properti kunci asing dengan nama navigasi dependen. 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 untuk 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. [InverseProperty] Menambahkan ke salah satu navigasi yang dipasangkan menyelesaikan ambiguitas ini dan memungkinkan EF untuk 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. Dengan satu hubungan, kedua navigasi dipasangkan secara otomatis.

DeleteBehaviorAttribute

Menurut konvensi, EF menggunakan ClientSetNull DeleteBehavior 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 Menghapus cascade untuk informasi selengkapnya tentang perilaku berkala.