Aracılığıyla paylaş


Model Oluşturma ve Yapılandırma

EF Core, uygulamanın varlık türlerinin temel alınan veritabanına nasıl eşlenmiş olduğunu açıklamak için bir meta veri modeli kullanır. Bu model, ortak desenleri arayabilen bir dizi kural - buluşsal yöntemler kullanılarak oluşturulur. Model daha sonra mapping öznitelikleri (veri ek açıklamaları olarak da bilinir) ve/veya içindeki ModelBuilder yöntemlerine (fluent API olarak da bilinir) yapılan çağrılar kullanılarak özelleştirilebilir; her iki durumda da varsayılan yapılandırmalar geçersiz kılınacaktır.

Çoğu yapılandırma, herhangi bir veri depolarını hedefleyen bir modele uygulanabilir. Sağlayıcılar ayrıca belirli bir veri deposuna özgü yapılandırmayı etkinleştirebilir ve desteklenmeyen veya geçerli olmayan yapılandırmayı da yoksayabilir. Sağlayıcıya özgü yapılandırma belgeleri için Veritabanı sağlayıcıları bölümüne bakın.

Tavsiye

Bu makalenin örneklerini GitHub'da görüntüleyebilirsiniz.

Model yapılandırmak için akıcı API kullanma

OnModelCreating yöntemini türetilmiş bağlamınızda geçersiz kılabilir ve modeli yapılandırmak için akıcı API'yi kullanabilirsiniz. Bu en güçlü yapılandırma yöntemidir ve varlık sınıflarınızı değiştirmeden yapılandırmanın belirtilmesine olanak tanır. Akıcı API yapılandırması en yüksek önceliğe sahiptir ve kuralları ve veri ek açıklamalarını geçersiz kılar. Yapılandırma, yöntemlerin çağrılma sırasına göre uygulanır ve çakışma olursa en son çağrı önceden belirtilen yapılandırmayı geçersiz kılar.

using Microsoft.EntityFrameworkCore;

namespace EFModeling.EntityProperties.FluentAPI.Required;

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    #region Required
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .IsRequired();
    }
    #endregion
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Tavsiye

Aynı yapılandırmayı modeldeki birden çok nesneye uygulamak için bkz. toplu yapılandırma.

Gruplandırma yapılandırması

OnModelCreating yönteminin boyutunu küçültmek için, bir varlık türünün tüm yapılandırması IEntityTypeConfiguration<TEntity> uygulayan ayrı bir sınıfa taşınabilir.

public class BlogEntityTypeConfiguration : IEntityTypeConfiguration<Blog>
{
    public void Configure(EntityTypeBuilder<Blog> builder)
    {
        builder
            .Property(b => b.Url)
            .IsRequired();
    }
}

Ardından Configure içinden OnModelCreating yöntemini çağırın.

new BlogEntityTypeConfiguration().Configure(modelBuilder.Entity<Blog>());

Derlemedeki tüm yapılandırmaları uygulama

Belirli bir derlemede IEntityTypeConfiguration'ü uygulayan türlerde belirtilen tüm yapılandırmaları uygulamak mümkündür.

modelBuilder.ApplyConfigurationsFromAssembly(typeof(BlogEntityTypeConfiguration).Assembly);

Uyarı

Yapılandırmaların uygulanacağı sıra tanımlanmamıştır, bu nedenle bu yöntem yalnızca sıra önemli olmadığında kullanılmalıdır.

Varlık türlerinde EntityTypeConfigurationAttribute kullanımı

Configure'yu açıkça çağırmak yerine, EF Core'un uygun yapılandırmayı bulup kullanabilmesi için varlık türüne bir EntityTypeConfigurationAttribute yerleştirilebilir. Örneğin:

[EntityTypeConfiguration(typeof(BookConfiguration))]
public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Isbn { get; set; }
}

Bu öznitelik, bir modelin içine IEntityTypeConfiguration varlık türü eklendiğinde, EF Core'un belirtilen Book uygulamasını kullanacağı anlamına gelir. Varlık türü, normal mekanizmalardan biri kullanılarak bir modele eklenir. Örneğin, varlık türü için bir DbSet<TEntity> özellik oluşturarak:

public class BooksContext : DbContext
{
    public DbSet<Book> Books { get; set; }

    //...

Veya OnModelCreating içinde kaydedilerek

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Book>();
}

Uyarı

EntityTypeConfigurationAttribute türler bir derlemede otomatik olarak bulunmayacak. Öznitelik bu varlık türünde bulunabilmesi için önce modele varlık türleri eklenmelidir.

Model yapılandırmak için veri ek açıklamalarını kullanma

Sınıflarınıza ve özelliklerinize belirli öznitelikleri de ( Veri Ek Açıklamaları olarak bilinir) uygulayabilirsiniz. Veri açıklamaları kuralları geçersiz kılacak, ancak Fluent API yapılandırması tarafından geçersiz kılınacaktır.

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;

namespace EFModeling.EntityProperties.DataAnnotations.Annotations;

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
}

[Table("Blogs")]
public class Blog
{
    public int BlogId { get; set; }

    [Required]
    public string Url { get; set; }
}

Yerleşik standartlar

EF Core, varsayılan olarak etkinleştirilen birçok model oluşturma kuralı içerir. Bunların tümünü arabirimini uygulayan IConvention sınıflar listesinde bulabilirsiniz. Ancak, bu liste üçüncü taraf veritabanı sağlayıcıları ve eklentileri tarafından sunulan kuralları içermez.

Uygulamalar bu kuralların herhangi birini kaldırabilir veya değiştirebilir, ayrıca EF tarafından tanınmayan desenler için yapılandırma uygulayan yeni özel kurallar ekleyebilir.

Tavsiye

Aşağıda gösterilen kod, ModelBuildingConventionsSample.cs dosyasından gelmektedir.

Mevcut bir kuralı kaldırma

Bazen yerleşik kurallardan biri uygulamanız için uygun olmayabilir ve bu durumda kaldırılabilir.

Tavsiye

Modeliniz yapılandırma için eşleme özniteliklerini (yani veri ek açıklamalarını) kullanmıyorsa, model oluşturmayı hızlandırmak için adı ile biten AttributeConvention tüm kurallar güvenle kaldırılabilir.

Örnek: Yabancı anahtar sütunlar için dizin oluşturmayın

Genellikle yabancı anahtar (FK) sütunları için dizinler oluşturmak mantıklıdır ve bu nedenle bunun için yerleşik bir kural vardır: ForeignKeyIndexConvention. ve Post ile ilişkili bir Blog varlık türünün model Author baktığımızda, biri BlogId FK için diğeri AuthorId FK için olmak üzere iki dizinin oluşturulduğunu görebiliriz.

  EntityType: Post
    Properties:
      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd
      AuthorId (no field, int?) Shadow FK Index
      BlogId (no field, int) Shadow Required FK Index
    Navigations:
      Author (Author) ToPrincipal Author Inverse: Posts
      Blog (Blog) ToPrincipal Blog Inverse: Posts
    Keys:
      Id PK
    Foreign keys:
      Post {'AuthorId'} -> Author {'Id'} ToDependent: Posts ToPrincipal: Author ClientSetNull
      Post {'BlogId'} -> Blog {'Id'} ToDependent: Posts ToPrincipal: Blog Cascade
    Indexes:
      AuthorId
      BlogId

Ancak dizinlerin ek yükü vardır ve bunları tüm FK sütunları için oluşturmak her zaman uygun olmayabilir. Bunu başarmak için, ForeignKeyIndexConvention modeli oluştururken kaldırılabilir:

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
}

Modelin şimdilik hata ayıklama görünümüne Post baktığımızda, FK'lerdeki dizinlerin oluşturulmadığını görüyoruz:

  EntityType: Post
    Properties:
      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd
      AuthorId (no field, int?) Shadow FK
      BlogId (no field, int) Shadow Required FK
    Navigations:
      Author (Author) ToPrincipal Author Inverse: Posts
      Blog (Blog) ToPrincipal Blog Inverse: Posts
    Keys:
      Id PK
    Foreign keys:
      Post {'AuthorId'} -> Author {'Id'} ToDependent: Posts ToPrincipal: Author ClientSetNull
      Post {'BlogId'} -> Blog {'Id'} ToDependent: Posts ToPrincipal: Blog Cascade

İstendiğinde, IndexAttribute veya OnModelCreating yapılandırması kullanılarak yabancı anahtar sütunları için dizinler açıkça oluşturulabilir.

Hata ayıklama görünümü

Model oluşturucu hata ayıklama görünümüne IDE'nizin hata ayıklayıcısında erişilebilir. Örneğin, Visual Studio ile:

Visual Studio hata ayıklayıcısından model oluşturucu hata ayıklama görünümüne erişme

Ayrıca doğrudan koddan da erişilebilir, örneğin hata ayıklama görünümünü konsola göndermek için:

Console.WriteLine(context.Model.ToDebugString());

Hata ayıklama görünümünün kısa ve uzun bir formu vardır. Uzun form, ilişkisel veya sağlayıcıya özgü meta verileri görüntülemeniz gerektiğinde yararlı olabilecek tüm ek açıklamaları da içerir. Uzun görünüme koddan da erişilebilir:

Console.WriteLine(context.Model.ToDebugString(MetadataDebugStringOptions.LongDefault));