Aracılığıyla paylaş


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ına göre, erişime açık ve alıcı ve ayarlayıcıya sahip olan tüm ö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 bir veritabanı kullanırken, varlık özellikleri, adları özelliklerle aynı olan tablo sütunlarına eşlenir.

Sütunlarınızı farklı adlarla yapılandırmayı tercih ediyorsanız, bunu aşağıdaki kod parçacığı gibi 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 uzunlukgibi özelliğin birincil anahtarın parçası olup olmadığı gibi diğer meta verileri de dikkate alır.

Örneğin, SQL Server sağlayıcısı DateTime özellikleri datetime2(7) sütunlara ve string özellikleri nvarchar(max) sütunlara (veya anahtar olarak kullanılan özellikler için nvarchar(450)) eşler.

Sütunlarınızı bir sütun için tam veri türünü belirtmek üzere de yapılandırabilirsiniz. Örneğin, aşağıdaki kod Url'ı maksimum uzunluğu 200 olan unicode olmayan bir dize olarak, Rating'yi 5 duyarlığı ve 2ölçeği ile ondalık sayı olarak yapılandırır.

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 bir ipucu sağlar. Uzunluk üst sınırı yalnızca string ve byte[]gibi dizi veri türleri için geçerlidir.

Not

Entity Framework, sağlayıcıya veri geçirmeden önce uzunluk üst sınırını doğrulamaz. Uygun olup olmadığını doğrulamak sağlayıcıya veya veri deposuna bağlı. Örneğin, SQL Server'ı hedeflerken maksimum 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'da nvarchar(500) türünde bir sütunun oluşturulmasına neden olur:

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

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

Kesinlik ve Ölçek

Bazı ilişkisel veri türleri duyarlık 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ğımlıdır, ancak çoğu veritabanında decimal ve DateTime türleri bu modelleri destekler. decimal özellikleri için hassasiyet, sütunun içereceği herhangi bir değeri ifade etmek için gereken maksimum basamak sayısını ve ölçek ise gereken maksimum ondalık basamak sayısını tanımlar. DateTime özellikleri için hassasiyet, 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çek doğrulaması yapmaz. Uygun şekilde doğrulamak sağlayıcıya veya veri deposuna bağlı. Örneğin, SQL Server'ı hedeflerken datetime veri türündeki bir sütun duyarlık ayarlanmasına izin vermezken, datetime2 biri 0 ile 7 arasında duyarlık içerebilir.

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

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

Ölçek, hassasiyet tanımlanmadan hiçbir zaman tanımlanmadığından, ölçeği tanımlamak için kullanılan Veri Açıklaması [Precision(precision, scale)] 'dir.

Unicode

Bazı ilişkisel veritabanlarında Unicode ve Unicode olmayan metin verilerini temsil eden farklı türler vardır. Örneğin, SQL Server'da nvarchar(x) UTF-16'daki Unicode verilerini temsil etmek için kullanılırken, Unicode olmayan verileri temsil etmek için varchar(x) kullanılır (ancak SQL Server UTF-8 desteği) ile ilgili 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:

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 nulliçermesi geçerliyse isteğe bağlı olarak kabul edilir. null bir özelliğe atanacak geçerli bir değer değilse, gerekli bir özellik olarak kabul edilir. İlişkisel veritabanı şemasına eşlenirken, gerekli özellikler boş bırakılamaz sütunlar olarak, isteğe bağlı özellikler de boş bırakılabilir sütunlar olarak oluşturulur.

Konvansiyonlar

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, boolvb.) sahip tüm özellikler gerektiği gibi yapılandırılır ve null 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# null atanabilir başvuru türleri (NRT), başvuru türlerinin null içermesi veya içermemesi için geçerli olup olmadığını belirten açıklama eklemesine izin verir. 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 geçirilebilir başvuru türleri EF Core'un davranışını şu ş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).
  • Null 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ği devre dışı bırakılmış ve etkinleştirilmiş olarak, gerekli ve isteğe bağlı özelliklere sahip bir varlık türünü göstermektedir.

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; } // Required by convention
    public string LastName { get; set; } // Required by convention
    public string? MiddleName { get; set; } // Optional by convention

    // Note the following use of constructor binding, which avoids compiled warnings
    // for uninitialized non-nullable properties.
    public Customer(string firstName, string lastName, string? middleName = null)
    {
        FirstName = firstName;
        LastName = lastName;
        MiddleName = middleName;
    }
}

C# kodunda ifade edilen null atanabilirlik, hem EF Core'un modeline hem de veritabanına taşındığından, aynı kavramı iki kez ifade etme gereğini ortadan kaldıran Fluent API veya Veri Ek Açıklamaları kullanımını gizlediğinden, null atanabilir başvuru türlerinin kullanılması önerilir.

Not

Mevcut bir projede null atanabilir referans türlerini etkinleştirirken dikkatli olun: Daha önce isteğe bağlı olarak yapılandırılan referans türü özellikleri, null atanabilir olarak açıkça belirtilmedikçe artık gerekli olarak 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.

Daha fazla bilgi için null atanabilir başvuru türleri ve bunların EF Core ile nasıl kullanılacağı hakkında, bu özelliğin ayrılmış belgeleme 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 sıralamaları

Harmanlama, metin sütunlarında tanımlanabilir ve bunların nasıl karşılaştırılıp sıralandığını belirler. Ö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, bunun yerine harmanlamayı veritabanı düzeyinde tanımlayın.

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

Sütun açıklamaları

Veritabanı sütununda ayarlanan ve şemanızı veritabanında belgelemenize olanak sağlayan rastgele bir metin açıklaması ayarlayabilirsiniz:

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

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

Sütun sırası

varsayılan olarak, Migrationsiç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ı sıra 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.