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 eşleme öznitelikleri (veri ek açıklamaları olarak da bilinir) ve/veya içindeki yöntemlere ModelBuilder (fluent API olarak da bilinir) OnModelCreating çağrıları kullanılarak özelleştirilebilir ve bunların her ikisi de kurallar tarafından gerçekleştirilen yapılandırmayı geçersiz kılar.

Ç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.

Bahşiş

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

Model yapılandırmak için fluent API kullanma

Türetilmiş bağlamınızdaki yöntemini geçersiz kılabilir OnModelCreating ve modelinizi 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. Fluent 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; }
}

Bahşiş

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 ayıklanabilir.

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

Ardından yalnızca OnModelCreating olayından Configure 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);

Dekont

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 kullanma EntityTypeConfigurationAttribute

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

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

Bu öznitelik, bir modele varlık türü eklendiğinde EF Core'un belirtilen IEntityTypeConfiguration uygulamayı Book 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 içinde kaydederek:OnModelCreating

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

Dekont

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 ek açıklamaları kuralları geçersiz kılar, ancak Fluent API yapılandırması tarafından geçersiz kılını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 kurallar

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.

Bahşiş

Aşağıda gösterilen kod ModelBuildingConventionsSample.cs dosyasından alınıyor.

Mevcut bir kuralı kaldırma

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

Bahşiş

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şturma

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 Authorile ilişkileri olan bir Post varlık türünün model hata ayıklama görünümüne Blog baktığımızda biri FK, diğeri de FK için BlogId olmak üzere iki dizinin oluşturulduğunu AuthorId 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, dizinler içinde veya yapılandırması OnModelCreatingkullanılarak IndexAttribute yabancı anahtar sütunları için 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:

Accessing the model builder debug view from the Visual Studio debugger

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));