Varlık Özellikleri

Modelinizdeki her varlık türünün, EF Core'un veritabanından okuyup yazacağı bir özellik kümesi vardır. İlişkisel veritabanı kullanıyorsanız varlık özellikleri tablo sütunlarıyla eşlenir.

Dahil edilen ve dışlanan özellikler

Kural gereği, bir getter ve bir ayarlayıcıya sahip tüm ortak özellikler modele dahil edilir.

Belirli özellikler aşağıdaki gibi dışlanabilir:

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

    [NotMapped]
    public DateTime LoadedFromDatabase { get; set; }
}

Sütun adları

Kural gereği, ilişkisel veritabanı kullanılırken varlık özellikleri, özelliğiyle aynı ada sahip tablo sütunlarıyla eşlenir.

Sütunlarınızı farklı adlarla yapılandırmayı tercih ederseniz aşağıdaki kod parçacığını kullanarak bunu yapabilirsiniz:

public class Blog
{
    [Column("blog_id")]
    public int BlogId { get; set; }

    public string Url { get; set; }
}

Sütun veri türleri

İlişkisel veritabanı kullanırken, veritabanı sağlayıcısı özelliğin .NET türüne göre bir veri türü seçer. Ayrıca yapılandırılan maksimum uzunluk, özelliğin birincil anahtarın parçası olup olmadığı gibi diğer meta verileri de dikkate alır.

Örneğin, SQL Server özellikleri sütunlara, özellikleri sütunlara nvarchar(max) (veya nvarchar(450) anahtar olarak kullanılan özellikler için) eşlerDateTime.stringdatetime2(7)

Sütunlarınızı, sütun için tam bir veri türü belirtmek üzere de yapılandırabilirsiniz. Örneğin, aşağıdaki kod en uzunluğa sahip unicode olmayan bir dize olarak yapılandırılır Url ve değerinin 2005 duyarlığı ve Rating ölçeği ile ondalık olarak yapılandırılır2:

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

    [Column(TypeName = "varchar(200)")]
    public string Url { get; set; }

    [Column(TypeName = "decimal(5, 2)")]
    public decimal Rating { get; set; }
}

Maksimum uzunluk

Maksimum uzunluğu yapılandırmak, veritabanı sağlayıcısına belirli bir özellik için seçebileceğiniz uygun sütun veri türü hakkında ipucu sağlar. Uzunluk üst sınırı yalnızca ve byte[]gibi string dizi veri türleri için geçerlidir.

Not

Entity Framework, sağlayıcıya veri geçirmeden önce maksimum uzunluk doğrulaması yapmaz. Uygun olup olmadığını doğrulamak sağlayıcıya veya veri deposuna aittir. Örneğin, SQL Server hedeflerken en fazla uzunluğun aşılması, temel alınan sütunun veri türü fazla verilerin depolanmasına izin vermediğinden bir özel durumla sonuçlanır.

Aşağıdaki örnekte en fazla 500 uzunluk yapılandırılması, SQL Server türünde bir sütunun nvarchar(500) oluşturulmasına neden olur:

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

    [MaxLength(500)]
    public string Url { get; set; }
}

Duyarlık ve Ölçek

Bazı ilişkisel veri türleri duyarlılığı ve ölçek modellerini destekler; bunlar hangi değerlerin depolanabileceğini ve sütun için ne kadar depolama alanı gerektiğini denetler. Duyarlık ve ölçeklendirmeyi destekleyen veri türleri veritabanına bağlıdır, ancak çoğu veritabanı decimal ve DateTime tür bu modelleri destekler. Özellikler için decimal duyarlık, sütunun içereceği herhangi bir değeri ifade etmek için gereken basamak sayısı üst sınırını, ölçek ise gereken en fazla ondalık basamak sayısını tanımlar. Özellikler için DateTime duyarlık, saniye kesirlerini ifade etmek için gereken maksimum basamak sayısını tanımlar ve ölçek kullanılmaz.

Not

Entity Framework, sağlayıcıya veri geçirmeden önce duyarlık veya ölçeklendirme doğrulaması yapmaz. Uygun şekilde doğrulamak sağlayıcıya veya veri deposuna aittir. Örneğin, SQL Server hedeflerken veri türündeki datetime bir sütun duyarlık ayarlanmasına izin vermezken, bir datetime2 sütun 0 ile 7 arasında duyarlık içerebilir.

Aşağıdaki örnekte, özelliğin Score duyarlık 14 ve ölçek 2 olacak şekilde yapılandırılması, SQL Server türünde decimal(14,2) bir sütunun oluşturulmasına neden olur ve özelliğin LastUpdated duyarlık 3'e sahip olacak şekilde yapılandırılması türünde datetime2(3)bir sütuna neden olur:

Not

Duyarlığı ve ölçeği yapılandırmak için Veri Ek Açıklaması EF Core 6.0'da kullanıma sunulmuştur.

public class Blog
{
    public int BlogId { get; set; }
    [Precision(14, 2)]
    public decimal Score { get; set; }
    [Precision(3)]
    public DateTime LastUpdated { get; set; }
}

İlk duyarlık tanımlanmadan ölçek hiçbir zaman tanımlanmadığından, ölçeği tanımlamak için Veri Ek Açıklaması şeklindedir [Precision(precision, scale)].

Unicode

Bazı ilişkisel veritabanlarında Unicode ve Unicode olmayan metin verilerini temsil eden farklı türler vardır. Örneğin, SQL Server'de nvarchar(x) UTF-16'da Unicode verilerini temsil etmek için kullanılırken varchar(x) Unicode olmayan verileri temsil etmek için kullanılır (ancak utf-8 desteği SQL Server notlara bakın). Bu kavramı desteklemeyen veritabanları için bunu yapılandırmanın hiçbir etkisi yoktur.

Metin özellikleri varsayılan olarak Unicode olarak yapılandırılır. Bir sütunu unicode olmayan olarak aşağıdaki gibi yapılandırabilirsiniz:

Not

Unicode'un yapılandırılması için Veri Ek Açıklaması EF Core 6.0'da kullanıma sunulmuştur.

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Unicode(false)]
    [MaxLength(22)]
    public string Isbn { get; set; }
}

Gerekli ve isteğe bağlı özellikler

Özelliğin içermesi nullgeçerliyse isteğe bağlı olarak kabul edilir. Bir özelliğe atanacak geçerli bir değer değilse null , gerekli bir özellik olarak kabul edilir. İlişkisel veritabanı şemasına eşlenirken gerekli özellikler null atanamaz sütunlar olarak, isteğe bağlı özellikler de null atanabilir sütunlar olarak oluşturulur.

Kurallar

Kural gereği, .NET türü null içerebilen bir özellik isteğe bağlı olarak yapılandırılırken, .NET türü null içeremeyen özellikler gerektiği gibi yapılandırılır. Örneğin, .NET değer türlerine (int, decimal, bool, vb.) sahip tüm özellikler gerektiği gibi yapılandırılır ve boş değer atanabilir .NET değer türlerine (int?, decimal?, , bool?vb.) sahip tüm özellikler isteğe bağlı olarak yapılandırılır.

C# 8, başvuru türlerinin null içermelerinin geçerli olup olmadığını belirterek açıklama eklemesine izin veren null atanabilir başvuru türleri (NRT) adlı yeni bir özellik kullanıma sunuldu. Bu özellik yeni proje şablonlarında varsayılan olarak etkindir, ancak açıkça kabul edilmediği sürece mevcut projelerde devre dışı kalır. Null atanabilir başvuru türleri EF Core'un davranışını aşağıdaki şekilde etkiler:

  • Boş değer atanabilir başvuru türleri devre dışı bırakılırsa, .NET başvuru türlerine sahip tüm özellikler kurala göre isteğe bağlı olarak yapılandırılır (örneğin, string).
  • Boş değer atanabilir başvuru türleri etkinleştirilirse, özellikler .NET türlerinin C# null atanabilirliğine göre yapılandırılır: string? isteğe bağlı olarak yapılandırılır, ancak string gerektiği gibi yapılandırılır.

Aşağıdaki örnek, null atanabilir başvuru özelliğinin devre dışı bırakılıp etkin olduğu gerekli ve isteğe bağlı özelliklere sahip bir varlık türünü gösterir:

public class CustomerWithoutNullableReferenceTypes
{
    public int Id { get; set; }

    [Required] // Data annotations needed to configure as required
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; } // Data annotations needed to configure as required

    public string MiddleName { get; set; } // Optional by convention
}

C# kodunda ifade edilen null atanabilirliği EF Core'un modeline ve veritabanına akıttığı ve aynı kavramı iki kez ifade etmek için Fluent API'sinin veya Veri Ek Açıklamalarının kullanımını gizlediğinden null atanabilir başvuru türlerinin kullanılması önerilir.

Not

Var olan bir projede null atanabilir başvuru türlerini etkinleştirirken dikkatli olun: Önceden isteğe bağlı olarak yapılandırılan başvuru türü özellikleri, boş değer atanabilecek şekilde açıkça açıklama eklenmediği sürece artık gerektiği gibi yapılandırılacaktır. İlişkisel veritabanı şemasını yönetirken, bu durum veritabanı sütununun null atanabilirliğini değiştiren geçişlerin oluşturulmasına neden olabilir.

Boş değer atanabilir başvuru türleri ve bunların EF Core ile nasıl kullanılacağı hakkında daha fazla bilgi için bu özelliğin ayrılmış belgeler sayfasına bakın.

Açık yapılandırma

Kurala göre isteğe bağlı olacak bir özellik aşağıdaki gibi gerekli olacak şekilde yapılandırılabilir:

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

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

Sütun harmanlamaları

Not

Bu özellik EF Core 5.0'da kullanıma sunulmuştur.

Metin sütunlarında harmanlama tanımlanabilir ve bunların nasıl karşılaştırılıp sıralandığı belirlenebilir. Örneğin, aşağıdaki kod parçacığı bir SQL Server sütununu büyük/küçük harfe duyarlı olmayacak şekilde yapılandırıyor:

modelBuilder.Entity<Customer>().Property(c => c.Name)
    .UseCollation("SQL_Latin1_General_CP1_CI_AS");

Veritabanındaki tüm sütunların belirli bir harmanlama kullanması gerekiyorsa, harmanlamayı veritabanı düzeyinde tanımlayın.

Harmanlamalar için EF Core desteği hakkında genel bilgiler harmanlama belgeleri sayfasında bulunabilir.

Sütun açıklamaları

Veritabanı sütununda ayarlanan rastgele bir metin açıklaması ayarlayabilir ve bu sayede şemanızı veritabanında belgeleyebilirsiniz:

Not

Ef Core 5.0'da veri ek açıklamaları aracılığıyla açıklamaları ayarlama tanıtıldı.

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

    [Comment("The URL of the blog")]
    public string Url { get; set; }
}

Sütun sırası

Not

Bu özellik EF Core 6.0'da kullanıma sunulmuştur.

Varsayılan olarak, Geçişler içeren bir tablo oluştururken EF Core önce birincil anahtar sütunlarını, ardından varlık türünün ve sahip olunan türlerin özelliklerini ve son olarak temel türlerdeki özellikleri sıralar. Ancak farklı bir sütun sırası belirtebilirsiniz:

public class EntityBase
{
    [Column(Order = 0)]
    public int Id { get; set; }
}

public class PersonBase : EntityBase
{
    [Column(Order = 1)]
    public string FirstName { get; set; }

    [Column(Order = 2)]
    public string LastName { get; set; }
}

public class Employee : PersonBase
{
    public string Department { get; set; }
    public decimal AnnualSalary { get; set; }
}

Fluent API'si, farklı özelliklerdeki öznitelikler aynı sipariş numarasını belirttiğinde çakışmaları çözmek de dahil olmak üzere özniteliklerle yapılan sıralamayı geçersiz kılmak için kullanılabilir.

Genel durumda çoğu veritabanının yalnızca tablo oluşturulduğunda sütunları sıralamayı desteklediğini unutmayın. Bu, sütun sırası özniteliğinin mevcut bir tablodaki sütunları yeniden sıralamak için kullanılamayacağı anlamına gelir.