Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
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));