Varlık Türleri
Bağlam üzerindeki bir DbSet türü de dahil olmak, EF Core modeline dahil olduğu anlamına gelir; genellikle varlıkolarak böyle bir türe başvurduk. EF Core, ve veritabanından varlık örnekleri okuyup yazabilir ve ilişkisel bir veritabanı kullanıyorsanız, geçişler aracılığıyla varlıklarınız için tablolar oluşturabilir EF Core.
Modeldeki türleri ekleme
Kurala göre, bağlamdaki DbSet özelliklerinde sunulan türler, modele varlık olarak dahil edilir. Yönteminde belirtilen varlık türleri OnModelCreating , diğer keşfedilen varlık türlerinin gezinti özelliklerini yinelemeli olarak inceleyerek bulunan her türlü tür olduğu gibi da dahil edilmiştir.
Aşağıdaki kod örneğinde, tüm türler dahil edilmiştir:
Blog, bağlamdaki bir DbSet özelliğinde kullanıma sunulduğundan dahildir.Post, gezinti özelliği aracılığıyla bulunduğundan dahil edilmiştirBlog.Posts.AuditEntryöğesinde 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; }
}
Modeldeki türler dışlanıyor
Modele bir türün dahil edilmesini istemiyorsanız, bu tür dışında bırakabilirsiniz:
[NotMapped]
public class BlogMetadata
{
public DateTime LoadedFromDatabase { get; set; }
}
Geçişlerden dışlama
Not
EF Core 5,0 ' de tabloları geçişlerin dışında bırakma özelliği sunulmuştur.
Bazen birden çok türde eşlenmiş aynı varlık türünün olması yararlı olur DbContext . Bu, sınırlı bağlamlarkullanılırken özellikle doğrudur, bu, her sınırlanmış bağlam için farklı bir türe sahip olmak yaygındır.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}
Bu yapılandırma geçişiyle AspNetUsers tabloyu oluşturmaz, ancak IdentityUser yine de modele dahil edilir ve normal olarak kullanılabilir.
Yeniden geçişleri kullanarak tabloyu yönetmeye başlamanız gerekiyorsa, dışlanmadığı durumlarda yeni bir geçiş oluşturulmalıdır AspNetUsers . Sonraki geçişte artık tabloda yapılan değişiklikler yer alacak.
Tablo adı
Kural gereği, her varlık türü, varlığı sunan DbSet özelliğiyle aynı ada sahip bir veritabanı tablosuna eşlenecek şekilde ayarlanır. Belirtilen 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 bir veritabanı kullanılırken, tablolar veritabanınızın varsayılan şemasında oluşturulan kurala göre yapılır. örneğin, Microsoft SQL Server dbo şemayı kullanacaktır (SQLite şemaları desteklemez).
Belirli bir şemada oluşturulacak tabloları 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 tablo için şema belirtmek yerine, Fluent API model düzeyinde varsayılan şemayı de tanımlayabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("blogging");
}
Varsayılan şemanın ayarlanması, diziler gibi diğer veritabanı nesnelerini de etkileyecek şekilde değişir.
Eşlemeyi görüntüle
varlık türleri Fluent apı kullanılarak veritabanı görünümleriyle eşleştirilebilir.
Not
EF, başvurulan görünümün veritabanında zaten bulunduğunu varsayacak ve bir geçişte otomatik olarak oluşturmayacak.
modelBuilder.Entity<Blog>()
.ToView("blogsView", schema: "blogging");
Bir görünüme eşleme varsayılan tablo eşlemesini kaldırır, ancak EF 5,0 ile başlayarak varlık türü de açıkça bir tabloyla eşleştirilebilir. Bu durumda sorgu eşlemesi sorgular için kullanılacaktır ve tablo eşleştirmesi güncelleştirmeler için kullanılacaktır.
İpucu
Bellek içi sağlayıcıyı kullanarak görünümlere eşlenmiş 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.
Tablo değerli işlev eşleme
Bir varlık türünü veritabanındaki bir tablo yerine tablo değerli bir işlevle (TVF) eşlemek mümkündür. Bunu göstermek için birden çok gönderiyle blogu temsil eden başka bir varlık tanımlayalim. Örnekte, varlık anahtarsız'dir, ancak olması gerekmez.
public class BlogWithMultiplePosts
{
public string Url { get; set; }
public int PostCount { get; set; }
}
Daha sonra, veritabanında aşağıdaki tablo değerli işlevi oluşturun. Bu, yalnızca birden fazla gönderiye sahip blogların yanı sıra bu blogların her biriyle ilişkili olan 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
)
Şimdi varlık BlogWithMultiplePosts Bu işlevle aşağıdaki şekilde eşleştirilebilir:
modelBuilder.Entity<BlogWithMultiplePosts>().HasNoKey().ToFunction("BlogsWithMultiplePosts");
Not
Bir varlığı tablo değerli bir işlevle eşlemek için işlevin parametresi parametresiz olmalıdır.
Genel olarak, varlık özellikleri TVF tarafından döndürülen eşleşen sütunlarla eşleştirilir. TVF tarafından döndürülen sütunlar varlık özelliğinden farklı adlara sahip ise, HasColumnName bir normal tabloyla eşleme yaparken olduğu gibi, varlığın sütunları yöntemi kullanılarak yapılandırılabilir.
Varlık türü tablo değerli bir işleve 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 üretir:
SELECT [b].[Url], [b].[PostCount]
FROM [dbo].[BlogsWithMultiplePosts]() AS [b]
WHERE [b].[PostCount] > 3
Tablo açıklamaları
Veritabanı tablosunda ayarlanan rastgele bir metin yorumu ayarlayabilirsiniz ve bu da şemanızı veritabanında belgelemenize olanak tanır:
Not
Veri açıklamaları aracılığıyla açıklamaları ayarlama EF Core 5,0 ' de tanıtılmıştır.
[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
Not
EF Core 5,0 ' de paylaşılan türdeki varlık türleri için destek sunuldu.
Aynı CLR türünü kullanan varlık türleri, paylaşılan türdeki varlık türleri olarak bilinir. Bu varlık türlerinin, CLR türüne ek olarak, paylaşılan türdeki varlık türü kullanıldığında sağlanması gereken benzersiz bir adla yapılandırılması gerekir. Bu, karşılık gelen DbSet özelliğin bir çağrı kullanılarak uygulanması gerektiği anlamına gelir Set .
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");
});
}
}