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ığıyla Blog.Posts bulunur.
  • AuditEntry içinde belirtildiği için OnModelCreating.
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");
            });
    }
}