Varlık Türleri
Bağlamınıza bir türün DbSet'in eklenmesi, EF Core'un modeline dahil olduğu anlamına gelir; genellikle böyle bir türe varlık olarak başvururuz. EF Core varlık örneklerini veritabanından/veritabanından okuyabilir ve yazabilir ve ilişkisel bir veritabanı kullanıyorsanız, EF Core geçişler aracılığıyla varlıklarınız için tablolar oluşturabilir.
Modele türleri dahil etme
Kurala göre, bağlamınızdaki DbSet özelliklerinde kullanıma sunulan türler, modele varlık olarak eklenir. Yönteminde OnModelCreating
belirtilen varlık türleri, bulunan diğer varlık türlerinin gezinti özellikleri özyinelemeli olarak keşfedilerek bulunan türler gibi eklenir.
Aşağıdaki kod örneğinde tüm türler yer almaktadır:
Blog
dahil edilir çünkü bağlam üzerindeki bir DbSet özelliğinde kullanıma sunulur.Post
dahil edilir çünkü gezinti özelliği aracılığıylaBlog.Posts
bulunur.AuditEntry
içinde belirtildiği içinOnModelCreating
.
internal class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AuditEntry>();
}
}
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 Blog Blog { get; set; }
}
public class AuditEntry
{
public int AuditEntryId { get; set; }
public string Username { get; set; }
public string Action { get; set; }
}
Türleri modelden dışlama
Modele bir tür eklenmesini istemiyorsanız, bunu dışlayabilirsiniz:
[NotMapped]
public class BlogMetadata
{
public DateTime LoadedFromDatabase { get; set; }
}
Geçişler dışında
Bazen aynı varlık türünün birden çok DbContext
türde eşlenmesi yararlı olabilir. Bu durum özellikle sınırlanmış bağlamlar kullanılırken geçerlidir ve her sınırlanmış bağlam için farklı DbContext
bir türe sahip olmak yaygın bir durumdur.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}
Bu yapılandırmayla geçişler tabloyu oluşturmaz AspNetUsers
, ancak IdentityUser
yine de modele dahil edilir ve normal şekilde kullanılabilir.
Geçişleri kullanarak tabloyu yönetmeye yeniden başlamanız gerekiyorsa, dışlanmadığı AspNetUsers
yeni bir geçiş oluşturulmalıdır. Sonraki geçişte artık tabloda yapılan değişiklikler yer alacaktır.
Tablo adı
Kurala göre, her varlık türü varlığı kullanıma sunan DbSet özelliğiyle aynı ada sahip bir veritabanı tablosuyla eşlenecek şekilde ayarlanır. Verilen varlık için hiçbir DbSet yoksa, sınıf adı kullanılır.
Tablo adını el ile yapılandırabilirsiniz:
[Table("blogs")]
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
Tablo şeması
İlişkisel veritabanı kullanılırken tablolar, veritabanınızın varsayılan şemasında oluşturulan kurala göre oluşturulur. Örneğin, Microsoft SQL Server şemayı dbo
kullanır (SQLite şemaları desteklemez).
Tabloları belirli bir şemada oluşturulacak şekilde aşağıdaki gibi yapılandırabilirsiniz:
[Table("blogs", Schema = "blogging")]
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
Her tablonun şemasını belirtmek yerine, varsayılan şemayı akıcı API ile model düzeyinde de tanımlayabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("blogging");
}
Varsayılan şemanın ayarlanmasının diziler gibi diğer veritabanı nesnelerini de etkileyeceğini unutmayın.
Eşlemeyi görüntüleme
Varlık türleri Fluent API kullanılarak veritabanı görünümlerine eşlenebilir.
Dekont
EF, başvuruda bulunan görünümün veritabanında zaten var olduğunu varsayar ve bunu geçişte otomatik olarak oluşturmaz.
modelBuilder.Entity<Blog>()
.ToView("blogsView", schema: "blogging");
Görünüme eşleme varsayılan tablo eşlemesini kaldırır, ancak varlık türü bir tabloya açıkça eşlenebilir. Bu durumda sorgu eşlemesi sorgular için, tablo eşlemesi ise güncelleştirmeler için kullanılır.
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.
Tablo değerli işlev eşlemesi
Varlık türünü veritabanındaki bir tablo yerine tablo değerli bir işleve (TVF) eşlemek mümkündür. Bunu göstermek için, birden çok gönderi içeren blogu temsil eden başka bir varlık tanımlayalım. Örnekte varlık anahtarsızdır ancak olması gerekmez.
public class BlogWithMultiplePosts
{
public string Url { get; set; }
public int PostCount { get; set; }
}
Ardından, veritabanında aşağıdaki tablo değerli işlevi oluşturun; bu işlev yalnızca birden çok gönderi içeren blogları ve bu blogların her biriyle ilişkili gönderi sayısını döndürür:
CREATE FUNCTION dbo.BlogsWithMultiplePosts()
RETURNS TABLE
AS
RETURN
(
SELECT b.Url, COUNT(p.BlogId) AS PostCount
FROM Blogs AS b
JOIN Posts AS p ON b.BlogId = p.BlogId
GROUP BY b.BlogId, b.Url
HAVING COUNT(p.BlogId) > 1
)
Artık varlık BlogWithMultiplePosts
aşağıdaki şekilde bu işleve eşlenebilir:
modelBuilder.Entity<BlogWithMultiplePosts>().HasNoKey().ToFunction("BlogsWithMultiplePosts");
Dekont
Bir varlığı tablo değerli bir işleve eşlemek için işlevin parametresiz olması gerekir.
Geleneksel olarak, varlık özellikleri TVF tarafından döndürülen eşleşen sütunlara eşlenir. TVF tarafından döndürülen sütunların adları entity özelliğinden farklıysa, varlığın sütunları normal bir tabloya eşlenirken olduğu gibi yöntemi kullanılarak HasColumnName
yapılandırılabilir.
Varlık türü tablo değerli bir işlevle eşlendiğinde sorgu:
var query = from b in context.Set<BlogWithMultiplePosts>()
where b.PostCount > 3
select new { b.Url, b.PostCount };
Aşağıdaki SQL'i üretir:
SELECT [b].[Url], [b].[PostCount]
FROM [dbo].[BlogsWithMultiplePosts]() AS [b]
WHERE [b].[PostCount] > 3
Tablo açıklamaları
Veritabanı tablosunda ayarlanan ve şemanızı veritabanında belgelemenize olanak sağlayan rastgele bir metin açıklaması ayarlayabilirsiniz:
[Comment("Blogs managed on the website")]
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
Paylaşılan tür varlık türleri
Aynı CLR türünü kullanan varlık türleri, paylaşılan tür varlık türleri olarak bilinir. Bu varlık türlerinin benzersiz bir adla yapılandırılması gerekir. Bu ad, CLR türüne ek olarak paylaşılan tür varlık türü her kullanıldığında sağlanmalıdır. Bu, karşılık gelen DbSet
özelliğin bir Set
çağrı kullanılarak uygulanması gerektiği anlamına gelir.
internal class MyContext : DbContext
{
public DbSet<Dictionary<string, object>> Blogs => Set<Dictionary<string, object>>("Blog");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.SharedTypeEntity<Dictionary<string, object>>(
"Blog", bb =>
{
bb.Property<int>("BlogId");
bb.Property<string>("Url");
bb.Property<DateTime>("LastUpdated");
});
}
}