Aracılığıyla paylaş


Anahtarsız Varlık Türleri

Uyarı

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.
  • Alışılagelmiş yöntemlerle hiçbir zaman keşfedilmezler.
  • Yalnızca gezinti eşleme özelliklerinin bir alt kümesini destekler, özellikle:
    • Bir ilişkinin sona ermesinin asıl nedeni asla olamazlar.
    • Sahip oldukları varlıklara erişimleri olmayabilir
    • Bunlar yalnızca normal varlıkları gösteren referans gezinme özellikleri içerebilir.
    • Varlıklar, anahtarsız varlık türlerine gezinti özellikleri içeremez.
  • [Keyless] veri ek açıklaması veya .HasNoKey() yöntem çağrısı ile 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şlenmelidir.
  • 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 bir varlık türünü bir veritabanı nesnesine eşlemek, ToTable veya ToView akıcı API kullanılarak gerçekleştirilir. 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 ToTabletablo 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.

Tavsiye

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:

await db.Database.ExecuteSqlRawAsync(
    @"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 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, DbContext öğesinin DbSet<T> içerecek şekilde yapılandırılması:

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

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

var postCounts = await db.BlogPostCounts.ToListAsync();

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

Tavsiye

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.

Tavsiye

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