Bagikan melalui


Bidang Backing

Bidang pencadangan 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 dikonfigurasi Url 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 bidang backing dengan menggunakan Anotasi Data atau API Fasih, misalnya jika nama bidang 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 default, EF akan selalu membaca dan menulis ke bidang pencadangan - dengan asumsi telah dikonfigurasi dengan benar - dan tidak akan pernah menggunakan properti . Namun, EF juga mendukung pola akses lainnya. Misalnya, sampel berikut menginstruksikan EF untuk menulis ke bidang backing hanya saat mewujudkan, dan menggunakan properti dalam semua kasus lain:

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 pelacak perubahan, bukan di jenis CLR 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"));