Anahtarsız Varlık Türleri

Dekont

Bu özellik, sorgu türleri adı altında eklendi. Daha sonra anahtarsız varlık türleri olarak yeniden adlandırıldı.

Normal varlık türlerine ek olarak, EF Core modeli anahtarsız varlık türleri içerebilir ve anahtar değerleri içermeyen verilerde veritabanı sorguları gerçekleştirmek için kullanılabilir.

Anahtarsız varlık türlerini tanımlama

Anahtarsız varlık türleri aşağıdaki gibi tanımlanabilir:

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

Anahtarsız varlık türleri özellikleri

Anahtarsız varlık türleri, devralma eşlemesi ve gezinti özellikleri gibi normal varlık türleriyle aynı eşleme özelliklerinin çoğunu destekler. İlişkisel depolarda, fluent API yöntemleri veya veri ek açıklamaları aracılığıyla hedef veritabanı nesnelerini ve sütunlarını yapılandırabilir.

Ancak, normal varlık türlerinden şunlardan farklıdır:

  • Tanımlanmış bir anahtar olamaz.
  • DbContext'teki değişiklikler hiçbir zaman izlenmez ve bu nedenle veritabanına hiçbir zaman eklenmez, güncelleştirilmez veya silinmez.
  • Hiçbir zaman kural tarafından keşfedilmedi.
  • Yalnızca gezinti eşleme özelliklerinin bir alt kümesini destekler, özellikle:
    • Hiçbir zaman bir ilişkinin asıl sonu gibi davranamayabilirler.
    • Sahip oldukları varlıklarda gezintileri olmayabilir
    • Bunlar yalnızca normal varlıkları işaret eden başvuru gezinti özellikleri içerebilir.
    • Varlıklar, anahtarsız varlık türlerine gezinti özellikleri içeremez.
  • Veri ek açıklaması veya .HasNoKey() yöntem çağrısı ile [Keyless] yapılandırılması gerekir.
  • Tanımlayıcı bir sorguyla eşlenebilir. Tanımlama sorgusu, anahtarsız varlık türü için veri kaynağı işlevi gören modelde bildirilen bir sorgudur.
  • Hiyerarşisi olabilir, ancak TPH olarak eşlenmesi gerekir.
  • Tablo bölme veya varlık bölme kullanılamaz.

Kullanım senaryoları

Anahtarsız varlık türleri için temel kullanım senaryolarından bazıları şunlardır:

  • SQL sorguları için dönüş türü olarak hizmet sunma.
  • Birincil anahtar içermeyen veritabanı görünümlerine eşleme.
  • Birincil anahtarı tanımlı olmayan tablolara eşleme.
  • Modelde tanımlanan sorgulara eşleme.

Veritabanı nesneleriyle eşleme

Anahtarsız varlık türünün veritabanı nesnesine eşlendiğinde veya ToView akıcı API kullanılarak ToTable elde edilir. EF Core perspektifinden bakıldığında, bu yöntemde belirtilen veritabanı nesnesi bir görünümdür, yani salt okunur sorgu kaynağı olarak ele alınıp güncelleştirme, ekleme veya silme işlemlerinin hedefi olamaz. Ancak bu, veritabanı nesnesinin aslında bir veritabanı görünümü olması gerektiği anlamına gelmez. Alternatif olarak, salt okunur olarak ele alınabilecek bir veritabanı tablosu olabilir. Buna karşılık, NORMAL varlık türleri için EF Core, yönteminde belirtilen bir veritabanı nesnesinin ToTable tablo olarak kabul edilebileceğini varsayar; bu da sorgu kaynağı olarak kullanılabileceğini, aynı zamanda güncelleştirme, silme ve ekleme işlemleri tarafından hedeflendiğini varsayar. Aslında, içinde ToTable bir veritabanı görünümünün adını belirtebilirsiniz ve görünüm veritabanında güncelleştirilebilir olacak şekilde yapılandırıldığı sürece her şeyin sorunsuz çalışması gerekir.

Örnek

Aşağıdaki örnekte, veritabanı görünümünü sorgulamak için anahtarsız varlık türlerinin nasıl kullanılacağı gösterilmektedir.

Bahşiş

Bu makalenin örneğini GitHub'da görüntüleyebilirsiniz.

İlk olarak basit bir Blog ve Post modeli tanımlayacağız:

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; }
}

Ardından, her blogla ilişkili gönderi sayısını sorgulamamıza olanak sağlayacak basit bir veritabanı görünümü tanımlayacağız:

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");

Ardından, sonucu veritabanı görünümünden tutacak bir sınıf tanımlayacağız:

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

Ardından, API kullanarak HasNoKey OnModelCreating'de anahtarsız varlık türünü yapılandıracağız. Anahtarsız varlık türü için eşlemeyi yapılandırmak için akıcı yapılandırma API'sini kullanırız:

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

Ardından, öğesini DbContext içerecek DbSet<T>şekilde yapılandıracağız:

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

Son olarak, veritabanı görünümünü standart şekilde sorgulayabiliriz:

var postCounts = db.BlogPostCounts.ToList();

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

Bahşiş

Bu türe karşı sorgular için kök işlevi görmesi için bağlam düzeyi sorgu özelliği (DbSet) tanımladığımıza da dikkat edin.

Bahşiş

Bellek içi sağlayıcıyı kullanarak görünümlere eşlenen anahtarsız varlık türlerini test etmek için, aracılığıyla bunları bir sorguya eşleyin ToInMemoryQuery. Daha fazla bilgi için bellek içi sağlayıcı belgelerine bakın.