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 Configure
yerine, 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.
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 Author
ile 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ı OnModelCreating
kullanı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:
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));