Bagikan melalui


Key

Kunci berfungsi sebagai pengidentifikasi unik untuk setiap instans entitas. Sebagian besar entitas di EF memiliki satu kunci, yang memetakan ke konsep kunci utama dalam database relasional (untuk entitas tanpa kunci, lihat Entitas tanpa kunci). Entitas dapat memiliki kunci tambahan di luar kunci primer (lihat Kunci Alternatif untuk informasi selengkapnya).

Mengonfigurasi kunci primer

Menurut konvensi, properti bernama Id atau <type name>Id akan dikonfigurasi sebagai kunci utama entitas.

internal class Car
{
    public string Id { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

internal class Truck
{
    public string TruckId { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Catatan

Jenis entitas yang dimiliki menggunakan aturan yang berbeda untuk menentukan kunci.

Anda dapat mengonfigurasi satu properti untuk menjadi kunci utama entitas sebagai berikut:

internal class Car
{
    [Key]
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Anda juga dapat mengonfigurasi beberapa properti untuk menjadi kunci entitas - ini dikenal sebagai kunci komposit. Konvensi hanya akan menyiapkan kunci komposit dalam kasus tertentu - seperti untuk koleksi jenis yang dimiliki.

Catatan

Atribut [PrimaryKey] ini diperkenalkan dalam EF Core 7.0. Gunakan FLUENT API dalam versi yang lebih lama.

[PrimaryKey(nameof(State), nameof(LicensePlate))]
internal class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Pembuatan nilai

Untuk kunci utama numerik dan GUID non-komposit, EF Core menyiapkan pembuatan nilai untuk Anda berdasarkan konvensi. Misalnya, kunci primer numerik di SQL Server secara otomatis disiapkan menjadi kolom IDENTITY. Untuk informasi selengkapnya, lihat dokumentasi tentang pembuatan nilai dan panduan untuk strategi pemetaan pewarisan tertentu.

Nama kunci primer

Menurut konvensi, pada database relasional kunci primer dibuat dengan nama PK_<type name>. Anda dapat mengonfigurasi nama batasan kunci utama sebagai berikut:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasKey(b => b.BlogId)
        .HasName("PrimaryKey_BlogId");
}

Jenis dan nilai kunci

Meskipun EF Core mendukung penggunaan properti dari jenis primitif apa pun sebagai kunci utama, termasuk string, , Guidbyte[] dan lainnya, tidak semua database mendukung semua jenis sebagai kunci. Dalam beberapa kasus, nilai kunci dapat dikonversi ke jenis yang didukung secara otomatis, jika tidak, konversi harus ditentukan secara manual.

Properti kunci harus selalu memiliki nilai non-default saat menambahkan entitas baru ke konteks, tetapi beberapa jenis akan dihasilkan oleh database. Dalam hal ini EF akan mencoba menghasilkan nilai sementara ketika entitas ditambahkan untuk tujuan pelacakan. Setelah SaveChanges disebut nilai sementara akan digantikan oleh nilai yang dihasilkan oleh database.

Penting

Jika properti kunci memiliki nilai yang dihasilkan oleh database dan nilai non-default ditentukan ketika entitas ditambahkan, maka EF akan mengasumsikan bahwa entitas sudah ada dalam database dan akan mencoba memperbaruinya alih-alih menyisipkan yang baru. Untuk menghindari hal ini, nonaktifkan pembuatan nilai atau lihat cara menentukan nilai eksplisit untuk properti yang dihasilkan.

Kunci Alternatif

Kunci alternatif berfungsi sebagai pengidentifikasi unik alternatif untuk setiap instans entitas selain kunci utama; dapat digunakan sebagai target hubungan. Saat menggunakan database relasional, ini memetakan ke konsep indeks/batasan unik pada kolom kunci alternatif dan satu atau beberapa batasan kunci asing yang mereferensikan kolom.

Tip

Jika Anda hanya ingin menerapkan keunikan pada kolom, tentukan indeks unik daripada kunci alternatif (lihat Indeks). Di EF, kunci alternatif bersifat baca-saja dan menyediakan semantik tambahan melalui indeks unik karena dapat digunakan sebagai target kunci asing.

Kunci alternatif biasanya diperkenalkan untuk Anda saat diperlukan dan Anda tidak perlu mengonfigurasinya secara manual. Menurut konvensi, kunci alternatif diperkenalkan untuk Anda saat Anda mengidentifikasi properti yang bukan kunci utama sebagai target hubungan.

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}

Anda juga dapat mengonfigurasi satu properti untuk menjadi kunci alternatif:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate);
}

Anda juga dapat mengonfigurasi beberapa properti untuk menjadi kunci alternatif (dikenal sebagai kunci alternatif komposit):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => new { c.State, c.LicensePlate });
}

Akhirnya, menurut konvensi, indeks dan batasan yang diperkenalkan untuk kunci alternatif akan diberi nama AK_<type name>_<property name> (untuk kunci <property name> alternatif komposit menjadi daftar nama properti yang dipisahkan garis bawah). Anda dapat mengonfigurasi nama indeks kunci alternatif dan batasan unik:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate)
        .HasName("AlternateKey_LicensePlate");
}