Varlık Özellikleri

Modelinizin her varlık türü, veritabanından okuma ve yazma EF Core bir özellik kümesine sahiptir. İlişkisel veritabanı kullanıyorsanız varlık özellikleri tablo sütunlarıyla eşler.

Dahil edilen ve dışlanan özellikler

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

Belirli özellikler aşağıdaki gibi hariç tutulabilirsiniz:

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ı adı içeren tablo sütunlarına eşlenmiş olur.

Sütunlarınızı farklı adlarla yapılandırmayı tercih ederseniz, 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, özelliğin birincil anahtarın parçası olup olmadığı vb. yapılandırılan maksimum uzunluk gibi diğer meta verileri de dikkate alır.

Örneğin, SQL Server sütunlara, özellikleri ise sütunlara (veya anahtar olarak kullanılan DateTimedatetime2(7)stringnvarchar(max)nvarchar(450) özelliklere) eşler.

Sütunlarınızı bir sütun için tam bir veri türü belirtmek üzere de yapılandırabilirsiniz. Örneğin, aşağıdaki kod, maksimum uzunluğu ve duyarlığı ve ölçeği ile ondalık olarak unicode olmayan bir dize Url200 olarak Rating52 yapılandırılı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; }
}

En fazla uzunluk

Maksimum uzunluğun yapılandırılması, veritabanı sağlayıcısına belirli bir özellik için seçecek uygun sütun veri türü hakkında bir ipucu sağlar. Uzunluk üst sayısı yalnızca ve gibi dizi veri türleri için stringbyte[] geçerlidir.

Not

Entity Framework sağlayıcıya veri geçirmeden önce uzunluk üst doğrulaması yapmaz. Doğrulanması sağlayıcıya veya veri deposuna bağlıdır. Örneğin, temel SQL Server veri türü fazla verilerin depolandırılamasına izin vermeyeceği için, en yüksek uzunluğun aşılırken bir özel durumla sonuçlanıyor.

Aşağıdaki örnekte, en fazla 500 uzunluğun yapılandırılması, dosya üzerinde türünde nvarchar(500) bir sütunun SQL Server:

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

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

Duyarlık ve Ölçeklendirme

Bazı ilişkisel veri türleri duyarlık ve ölçek türlerini destekler; Bunlar depolanması gereken değerleri ve sütun için ne kadar depolama alanı gerektiğini kontrol eder. Duyarlık ve ölçeklendirmeyi destekleyen veri türleri veritabanına bağımlıdır, ancak çoğu veritabanı ve decimalDateTime türü bu türleri destekler. Özellikler için duyarlık, sütunda yer alan herhangi bir değeri ifade etmek için gereken basamak sayısı üst sayısını, ölçeklendirme ise gereken maksimum decimal ondalık basamak sayısını tanımlar. Özellikler DateTime için duyarlık, saniyelerin kesirlerini ifade etmek için gereken basamak sayısı üst sayısını tanımlar ve ölçek kullanılamaz.

Not

Entity Framework sağlayıcıya veri geçirmeden önce duyarlık veya ölçeklendirme doğrulaması yapmaz. Doğrulanması sağlayıcıya veya veri deposuna bağlıdır. Örneğin, veri SQL Server sütun duyarlık ayarlamaya izin vermezken, bir sütunda 0 ile 7 dahil arasında datetimedatetime2 duyarlık olabilir.

Aşağıdaki örnekte, özelliğin duyarlık 14 ve ölçek 2'ye sahip olacak şekilde yapılandırılması SQL Server türünde bir sütun oluşturulacak ve özelliğin duyarlık 3 olacak şekilde yapılandırılması türünde bir sütuna neden Scoredecimal(14,2)LastUpdateddatetime2(3) olur:

Not

Duyarlık ve ölçek yapılandırması için Veri Ek Açıklaması, EF Core 6.0'da tanıtıldı.

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

İlk olarak duyarlık tanımlamadan ölçek hiçbir zaman tanımlanmamıştır, bu nedenle ölçeği tanımlamak için Veri Ek Açıklaması [Precision(precision, scale)] olur.

Unicode

Bazı ilişkisel veritabanlarında Unicode ve Unicode olmayan metin verilerini temsil eden farklı türler vardır. Örneğin SQL Server'de UTF-16'daki Unicode verilerini temsil etmek için kullanılırken Unicode olmayan verileri temsil etmek için kullanılır nvarchar(x)varchar(x) (ancak nvarchar(x)desteği ile ilgili notlara bakın). Bu kavramı desteklemeen 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'u yapılandırmak için Veri Ek Açıklaması, EF Core 6.0'da tanıtıldı.

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 için geçerli olması isteğe bağlı olarak kabul null edilir. nullbir özelik atanacak geçerli bir değer değilse, gerekli bir özellik olarak kabul edilir. İlişkisel veritabanı şemasına eşlerken, gerekli özellikler null değerdilemez sütunlar olarak oluşturulur ve isteğe bağlı özellikler null değere değiştirilebilir sütunlar olarak oluşturulur.

Kurallar

Kural gereği, .NET türü null içere bir özellik isteğe bağlı olarak yapılandırılırken.NET türü null içere olmayan özellikler gerekli şekilde yapılandırılır. Örneğin, .NET değer türlerine sahip tüm özellikler ( int , decimal , bool vb.) , gerekli olarak yapılandırılır ve null değere sahip tüm özellikler .NET değer türleri ( int? , decimal? , bool? vb.) isteğe bağlı olarak yapılandırılır.

C# 8, başvuru türlerinin null olup olmadığının geçerli olup olmadığını belirten açıklama ek açıklamalarına izin veren null değere değiştirilebilir başvuru türleri (NRT)adlı yeni bir özellik ortaya çıktı. Bu özellik varsayılan olarak devre dışıdır ve EF Core aşağıdaki şekilde davranışını etkiler:

  • Null değere döndürebilir başvuru türleri devre dışı bırakılırsa (varsayılan), .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 değere değiştirilebilir başvuru türleri etkinleştirilirse özellikler, .NET türlerinin C# null değerine göre yapılandırılır: isteğe bağlı olarak yapılandırılır, ancak gerekli string?string şekilde yapılandırılır.

Aşağıdaki örnek, null değere değiştirilebilir başvuru özelliğinin devre dışı (varsayılan) ve 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 değer atılabilirliği EF Core'nin modeline ve veritabanına akışa akan ve aynı kavramı iki kez ifade etmek için Fluent API'si veya Veri Ek Açıklamaları kullanımını yok sayan null değer atılabilir başvuru türlerinin kullanılması önerilir.

Not

Var olan bir projede null değere değiştirilebilir başvuru türlerini etkinleştirerek dikkatli olun: Önceden isteğe bağlı olarak yapılandırılan başvuru türü özellikleri, açıkça null değere alınamaz olarak açık bir şekilde açıklama ekli olmadığı sürece artık gerekli şekilde yapılandırılır. İlişkisel veritabanı şemasını yöneterek geçişlerin oluşturularak veritabanı sütununu null değerle değiştirmesi sağlanabilir.

Null değere alınabilir başvuru türleri ve bu türlerin EF Core için bu özelliğin ayrılmış belge 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 yalanabilir:

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

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

Sütun harmanlamaları

Not

Bu özellik 5.0 EF Core tanıtıldı.

Metin sütunlarının nasıl karşılaştırıldıklarının ve sıralandığın belirlenerek bir harmanlama tanımlanabilir. Örneğin, aşağıdaki kod parçacığı bir SQL Server büyük/küçük harfe duyarsız olacak ş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ı gerekirse, bunun yerine harmanlamayı veritabanı düzeyinde tanımlayın.

Harmanlamalar EF Core hakkında genel bilgiler harmanlama belgeleri sayfasında bulunabilir.

Sütun yorumları

Veritabanında şemanızı belgeleyerek veritabanı sütununa rastgele bir metin açıklaması ekleyebilirsiniz:

Not

5.0'da, veri ek açıklamaları EF Core ayarlandı.

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 tanıtıldı.

Varsayılan olarak, Geçişlerile 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ürlerden özellikleri sipariş eder. 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ı özelliklerde öznitelikler aynı sipariş numarasını belirttiğinizde çakışmaların çözülmesi 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ı desteklemesi gerekir. Bu, var olan bir tablodaki sütunları yeniden sıralamak için sütun sırası özniteliğinin kullanılamay anlamına gelir.