Anahtarsız Varlık Türleri
Not
Bu özellik, sorgu türleri adının altına eklendi. Daha sonra anahtarsız varlık türleri olarak yeniden adlandırıldı. [Keyless]Veri ek açıklaması EFCore 5,0 ' de kullanılabilir duruma geldi.
Normal varlık türlerine ek olarak, bir EF Core modeli, anahtar değerleri içermeyen verilere karşı veritabanı sorgularını yürütmek için kullanılabilen, daha seyrek varlık türleriiçerebilir.
Keyless varlık türlerini tanımlama
keyless varlık türleri, veri ek açıklaması veya Fluent apı 'si kullanılarak tanımlanabilir:
[Keyless]
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
Keyless varlık türleri özellikleri
Keyless 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, hedef veritabanı nesnelerini ve sütunları Fluent API Yöntemler veya veri ek açıklamaları aracılığıyla yapılandırabilirler.
Ancak bunlar, normal varlık türlerinden farklıdır:
- Tanımlı bir anahtar olamaz.
- , DbContext 'teki değişiklikler için hiçbir şekilde izlenmez ve bu nedenle veritabanında hiçbir şekilde eklenmemiş, güncellenmez veya silinmez.
- Hiçbir şekilde kural tarafından keşfedilir.
- Yalnızca bir gezinti eşleme özellikleri alt kümesini destekler, özellikle:
- Bir ilişkinin asıl ucu olarak hiçbir şekilde davranmayabilir.
- Sahip oldukları varlıkların gezginlerine sahip olmayabilir
- Yalnızca normal varlıkların işaret eden başvuru gezinti özelliklerini içerebilir.
- Varlıklar, anahtarsız varlık türlerine gezinti özellikleri içeremez.
- Bir
[Keyless]veri ek açıklaması veya.HasNoKey()yöntem çağrısıyla yapılandırılmalıdır. - , Tanımlayan bir sorguylaeşleştirilebilir. Tanımlama sorgusu, modelde tanımlanan ve anahtarsız varlık türü için veri kaynağı olarak davranan bir sorgudur.
Kullanım senaryoları
Anahtarsız varlık türlerine yönelik ana kullanım senaryolarından bazıları şunlardır:
- ham 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ımlanmış olmayan tablolarla eşleme.
- Modelde tanımlanan sorgularla eşleme.
Veritabanı nesneleriyle eşleme
Anahtarsız varlık türünü bir veritabanı nesnesiyle eşlemek veya Fluent API kullanılarak elde edilir ToTableToView . EF Core perspektifinden, bu yöntemde belirtilen veritabanı nesnesi bir görünümdir, yani salt okunurdur bir sorgu kaynağı olarak kabul edilir ve güncelleştirme, ekleme veya silme işlemlerinin hedefi olamaz. Ancak bu, veritabanı nesnesinin gerçekten bir veritabanı görünümü olması gerektiği anlamına gelmez. Alternatif olarak, salt okunurdur olarak değerlendirilecek bir veritabanı tablosu olabilir. Buna karşılık, normal varlık türleri için EF Core, yöntemde belirtilen bir veritabanı nesnesinin ToTableToTableolarak değerlendirilebileceği, yani bir sorgu kaynağı olarak kullanılabileceği, ancak aynı zamanda Update, DELETE ve INSERT işlemlerine hedeflenmiş olduğunu varsayar. Aslında, içinde bir veritabanı görünümünün adını belirtebilir ToTable ve görünümün veritabanında güncelleştirimek üzere yapılandırıldığı sürece her şey iyi çalışmalıdır.
Not
EF Core 5,0 ' ne kadar ToView nesnenin veritabanında zaten var olduğunu ve geçişler tarafından oluşturulmayacağız. EF Core 5,0 ' de ve daha sonra modelBuilder.Entity<ViewType>().ToTable("ViewNameInDatabase", t => t.ExcludeFromMigrations()) nesneyi geçişlerden dışlamak için, bkz. modelBuilder.Entity<ViewType>().ToTable("ViewNameInDatabase", t => t.ExcludeFromMigrations()).
Örnek
Aşağıdaki örnek, bir veritabanı görünümünü sorgulamak için anahtarsız varlık türlerinin nasıl kullanılacağını gösterir.
İpucu
Bu makalenin örneğini GitHub görüntüleyebilirsiniz.
İlk olarak, basit bir blog ve gönderi modeli tanımladık:
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 bloga ait gönderi sayısını sorgulamanızı sağlayacak basit bir veritabanı görünümü tanımladık:
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");
Sonra, veritabanı görünümünden elde edilen sonucu barındıracak bir sınıf tanımlayacağız:
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
Daha sonra, API kullanarak onmodelyaratırken anahtarsız varlık türünü yapılandıracağız . Anahtarsız varlık türü için eşlemeyi yapılandırmak üzere floent Yapılandırma API 'sini kullanıyoruz:
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 şunları içerecek şekilde yapılandıracağız DbSet<T> :
public DbSet<BlogPostsCount> BlogPostCounts { get; set; }
Son olarak, veritabanı görünümünü standart şekilde sorgulayabilir:
var postCounts = db.BlogPostCounts.ToList();
foreach (var postCount in postCounts)
{
Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
Console.WriteLine();
}
İpucu
Ayrıca, bu tür bir sorgu için kök görevi gören bir bağlam düzeyi sorgu özelliği (DbSet) tanımladık.
İpucu
Bellek içi sağlayıcıyı kullanan görünümlere eşlenmiş anahtarsız varlık türlerini test etmek için bunları aracılığıyla bir sorgu ile eşleyin ToInMemoryQuery . Daha fazla ayrıntı için bu tekniği kullanarak bir çalıştırılabilir örnek bölümüne bakın.