Share via


Destek Alanları

Yedekleme alanları, EF'nin özellik yerine bir alana okumasına ve/veya yazmasına olanak sağlar. Uygulama koduna göre verilere erişimle ilgili semantiğin kullanımını kısıtlamak ve/veya geliştirmek için sınıfta kapsülleme kullanılırken bu yararlı olabilir, ancak bu kısıtlamalar/geliştirmeler kullanılmadan değer veritabanından okunmalı ve/veya yazılmalıdır.

Temel yapılandırma

Kural gereği, aşağıdaki alanlar belirli bir özelliğin (öncelik sırasına göre listelenmiştir) yedekleme alanları olarak bulunur.

  • <camel-cased property name>
  • _<camel-cased property name>
  • _<property name>
  • m_<camel-cased property name>
  • m_<property name>

Aşağıdaki örnekte özelliği, Url yedekleme alanı olarak sahip olacak _url şekilde yapılandırılır:

public class Blog
{
    private string _url;

    public int BlogId { get; set; }

    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }
}

Yedekleme alanlarının yalnızca modele dahil edilen özellikler için bulunduğunu unutmayın. Modele hangi özelliklerin dahil olduğu hakkında daha fazla bilgi için bkz . Özellikleri Dahil Etme ve Dışlama.

Veri Ek Açıklamaları veya Fluent API'sini kullanarak da yedekleme alanlarını yapılandırabilirsiniz; örneğin, alan adı yukarıdaki kurallarla uyuşmuyorsa:

public class Blog
{
    private string _validatedUrl;

    public int BlogId { get; set; }

    [BackingField(nameof(_validatedUrl))]
    public string Url
    {
        get { return _validatedUrl; }
    }

    public void SetUrl(string url)
    {
        // put your validation code here

        _validatedUrl = url;
    }
}

Alan ve özellik erişimi

Varsayılan olarak, EF her zaman yedekleme alanını okur ve yazar ( birinin düzgün yapılandırıldığı varsayılır) ve özelliği hiçbir zaman kullanmaz. Ancak EF, diğer erişim desenlerini de destekler. Örneğin, aşağıdaki örnekte EF'ye yalnızca yedekleme alanına yazması ve diğer tüm durumlarda özelliğini kullanması talimatı verilmiştir:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasField("_validatedUrl")
        .UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction);
}

Desteklenen seçenekler kümesinin tamamı için bkz. PropertyAccessMode sabit listesi .

Yalnızca alan özellikleri

Ayrıca, modelinizde varlık sınıfında karşılık gelen clr özelliği olmayan, ancak bunun yerine verileri varlıkta depolamak için bir alan kullanan bir kavramsal özellik oluşturabilirsiniz. Bu, verilerin varlığın CLR türü yerine değişiklik izleyicisinde depolandığı Gölge Özellikler'den farklıdır. Yalnızca alan özellikleri, varlık sınıfı değerleri almak/ayarlamak için özellikler yerine yöntemler kullandığında veya alanların etki alanı modelinde hiç gösterilmemesi gereken durumlarda (örneğin birincil anahtarlar) yaygın olarak kullanılır.

API'de Property(...) bir ad sağlayarak yalnızca alan özelliğini yapılandırabilirsiniz:

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property("_validatedUrl");
    }
}

public class Blog
{
    private string _validatedUrl;

    public int BlogId { get; set; }

    public string GetUrl()
    {
        return _validatedUrl;
    }

    public void SetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            var response = client.GetAsync(url).Result;
            response.EnsureSuccessStatusCode();
        }

        _validatedUrl = url;
    }
}

EF, belirtilen ada sahip bir CLR özelliğini veya bir özellik bulunamazsa bir alanı bulmaya çalışır. Bir özellik veya alan bulunmazsa, bunun yerine bir gölge özellik ayarlanır.

LINQ sorgularından yalnızca alan özelliğine başvurmanız gerekebilir, ancak bu alanlar genellikle özeldir. LinQ sorgusunda yöntemini kullanarak EF.Property(...) alana başvurabilirsiniz:

var blogs = db.blogs.OrderBy(b => EF.Property<string>(b, "_validatedUrl"));