Bidang Pendukung

Bidang penyimpanan sementara memungkinkan EF membaca dan/atau menulis ke bidang daripada properti. Ini dapat berguna ketika enkapulasi di kelas sedang digunakan untuk membatasi penggunaan dan/atau meningkatkan semantik sekeliling akses ke data dengan kode aplikasi, tetapi nilai harus dibaca dari dan/atau ditulis ke database tanpa menggunakan batasan/peningkatan tersebut.

Konfigurasi dasar

Menurut konvensi, bidang berikut akan ditemukan sebagai bidang cadangan untuk properti tertentu (tercantum dalam urutan prioritas).

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

Dalam sampel berikut, properti Url dikonfigurasi untuk memiliki _url sebagai bidang cadangannya:

public class Blog
{
    private string _url;

    public int BlogId { get; set; }

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

Perhatikan bahwa bidang backing hanya ditemukan untuk properti yang disertakan dalam model. Untuk informasi selengkapnya tentang properti mana yang disertakan dalam model, lihat Menyertakan & Mengecualikan Properti.

Anda juga dapat mengonfigurasi field pendukung dengan menggunakan Anotasi Data atau Fluent API, misalnya jika nama field tidak sesuai dengan konvensi di atas:

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;
    }
}

Akses bidang dan properti

Secara bawaan, EF akan selalu membaca dan menulis ke field penyimpanan - dengan asumsi telah dikonfigurasi dengan benar - dan tidak akan pernah menggunakan properti. Namun, EF juga mendukung pola akses lainnya. Misalnya, sampel berikut memberi instruksi EF untuk menulis ke field pendukung hanya saat memberikan bentuk, dan memanfaatkan properti untuk semua kasus lainnya.

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

Lihat enum PropertyAccessMode untuk kumpulan lengkap opsi yang didukung.

Properti khusus bidang

Anda juga dapat membuat properti konseptual dalam model Anda yang tidak memiliki properti CLR yang sesuai di kelas entitas, tetapi sebaliknya menggunakan bidang untuk menyimpan data di entitas. Ini berbeda dari Properti Bayangan, di mana data disimpan di "change tracker", daripada pada tipe CLR dari entitas. Properti bidang-saja umumnya digunakan ketika kelas entitas menggunakan metode alih-alih properti untuk mendapatkan/mengatur nilai, atau dalam kasus di mana bidang tidak boleh diekspos sama sekali dalam model domain (misalnya kunci primer).

Anda dapat mengonfigurasi properti khusus bidang dengan memberikan nama di Property(...) API:

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 akan mencoba menemukan properti CLR dengan nama yang diberikan, atau bidang jika properti tidak ditemukan. Jika properti atau bidang tidak ditemukan, properti bayangan akan disiapkan sebagai gantinya.

Anda mungkin perlu merujuk ke properti khusus bidang dari kueri LINQ, tetapi bidang tersebut biasanya bersifat privat. Anda bisa menggunakan EF.Property(...) metode dalam kueri LINQ untuk merujuk ke bidang :

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