Jenis Entitas Tanpa Kunci

Catatan

Fitur ini ditambahkan dengan nama tipe kueri. Kemudian diganti namanya menjadi jenis entitas tanpa kunci.

Selain jenis entitas reguler, model EF Core dapat berisi jenis entitas tanpa kunci, yang dapat digunakan untuk melakukan kueri database terhadap data yang tidak berisi nilai kunci.

Menentukan jenis entitas Keyless

Jenis entitas tanpa kunci dapat didefinisikan sebagai berikut:

[Keyless]
public class BlogPostsCount
{
    public string BlogName { get; set; }
    public int PostCount { get; set; }
}

Karakteristik jenis entitas tanpa kunci

Jenis entitas tanpa kunci mendukung banyak kemampuan pemetaan yang sama dengan jenis entitas reguler, seperti pemetaan warisan dan properti navigasi. Di penyimpanan relasional, mereka dapat mengonfigurasi objek dan kolom database target melalui metode API yang fasih atau anotasi data.

Namun, mereka berbeda dari jenis entitas reguler karena mereka:

  • Tidak dapat menentukan kunci.
  • Tidak pernah dilacak untuk perubahan di DbContext dan oleh karena itu tidak pernah dimasukkan, diperbarui, atau dihapus pada database.
  • Tidak pernah ditemukan oleh konvensi.
  • Hanya mendukung subset kemampuan pemetaan navigasi, khususnya:
    • Mereka mungkin tidak pernah bertindak sebagai akhir utama dari suatu hubungan.
    • Mereka mungkin tidak memiliki navigasi ke entitas yang dimiliki
    • Mereka hanya dapat berisi properti navigasi referensi yang menunjuk ke entitas reguler.
    • Entitas tidak boleh berisi properti navigasi ke jenis entitas tanpa kunci.
  • Perlu dikonfigurasi dengan anotasi [Keyless] data atau .HasNoKey() panggilan metode.
  • Dapat dipetakan ke kueri yang menentukan. Kueri yang menentukan adalah kueri yang dideklarasikan dalam model yang bertindak sebagai sumber data untuk jenis entitas tanpa kunci.
  • Dapat memiliki hierarki, tetapi harus dipetakan sebagai TPH.
  • Tidak dapat menggunakan pemisahan tabel atau pemisahan entitas.

Skenario penggunaan

Beberapa skenario penggunaan utama untuk jenis entitas tanpa kunci adalah:

  • Berfungsi sebagai jenis pengembalian untuk kueri SQL.
  • Pemetaan ke tampilan database yang tidak berisi kunci utama.
  • Pemetaan ke tabel yang tidak memiliki kunci utama yang ditentukan.
  • Pemetaan ke kueri yang ditentukan dalam model.

Pemetaan ke objek database

Pemetaan jenis entitas tanpa kunci ke objek database dicapai menggunakan ToTable API atau ToView fasih. Dari perspektif EF Core, objek database yang ditentukan dalam metode ini adalah tampilan, yang berarti bahwa itu diperlakukan sebagai sumber kueri baca-saja dan tidak dapat menjadi target operasi pembaruan, sisipkan, atau hapus. Namun, ini tidak berarti bahwa objek database sebenarnya diperlukan untuk menjadi tampilan database. Ini dapat menjadi tabel database yang akan diperlakukan sebagai baca-saja. Sebaliknya, untuk jenis entitas reguler, EF Core mengasumsikan bahwa objek database yang ditentukan dalam ToTable metode dapat diperlakukan sebagai tabel, yang berarti dapat digunakan sebagai sumber kueri tetapi juga ditargetkan oleh operasi pembaruan, hapus, dan sisipkan. Bahkan, Anda dapat menentukan nama tampilan database dan semuanya harus berfungsi dengan baik selama tampilan dikonfigurasi ToTable agar dapat diperbarui pada database.

Contoh

Contoh berikut menunjukkan cara menggunakan jenis entitas tanpa kunci untuk mengkueri tampilan database.

Tip

Anda dapat melihat contoh artikel ini di GitHub.

Pertama, kami mendefinisikan model Blog dan Post sederhana:

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public ICollection<Post> Posts { get; set; }
}

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

Selanjutnya, kita menentukan tampilan database sederhana yang akan memungkinkan kita untuk mengkueri jumlah postingan yang terkait dengan setiap blog:

db.Database.ExecuteSqlRaw(
    @"CREATE VIEW View_BlogPostCounts AS
                SELECT b.Name, Count(p.PostId) as PostCount
                FROM Blogs b
                JOIN Posts p on p.BlogId = b.BlogId
                GROUP BY b.Name");

Selanjutnya, kita menentukan kelas untuk menahan hasil dari tampilan database:

public class BlogPostsCount
{
    public string BlogName { get; set; }
    public int PostCount { get; set; }
}

Selanjutnya, kami mengonfigurasi jenis entitas tanpa kunci di OnModelCreating menggunakan HasNoKey API. Kami menggunakan API konfigurasi fasih untuk mengonfigurasi pemetaan untuk jenis entitas tanpa kunci:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<BlogPostsCount>(
            eb =>
            {
                eb.HasNoKey();
                eb.ToView("View_BlogPostCounts");
                eb.Property(v => v.BlogName).HasColumnName("Name");
            });
}

Selanjutnya, kami mengonfigurasi DbContext untuk menyertakan DbSet<T>:

public DbSet<BlogPostsCount> BlogPostCounts { get; set; }

Terakhir, kita dapat mengkueri tampilan database dengan cara standar:

var postCounts = db.BlogPostCounts.ToList();

foreach (var postCount in postCounts)
{
    Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
    Console.WriteLine();
}

Tip

Perhatikan bahwa kami juga telah menentukan properti kueri tingkat konteks (DbSet) untuk bertindak sebagai akar kueri terhadap jenis ini.

Tip

Untuk menguji jenis entitas tanpa kunci yang dipetakan ke tampilan menggunakan penyedia dalam memori, petakan ke kueri melalui ToInMemoryQuery. Lihat dokumen penyedia dalam memori untuk informasi selengkapnya.