Háttérmezők

Az háttérmezők lehetővé teszik az EF számára, hogy tulajdonság helyett mezőt olvasson és/vagy írjon. Ez akkor lehet hasznos, amikor az osztály zártságát használjuk az adatok elérésének korlátozására és/vagy a szemantikájának javítására az alkalmazáskód által, de az érték olvasása és/vagy írása az adatbázisba a korlátozások/javítások alkalmazása nélkül történik.

Alapszintű konfiguráció

Konvenció szerint a következő mezők lesznek felderítve egy adott tulajdonság háttérmezőiként (sorrendben felsorolva).

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

A következő példában a Url tulajdonság úgy van konfigurálva, hogy _url a háttérmezője legyen:

public class Blog
{
    private string _url;

    public int BlogId { get; set; }

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

Vegye figyelembe, hogy a háttérmezők csak a modellben szereplő tulajdonságok esetében találhatók. További információ arról, hogy mely tulajdonságok szerepelnek a modellben, lásd a A tulajdonságok belefoglalása és kizárása fejezetet.

A háttérmezőket adatjegyzetekkel vagy a Fluent API-val is konfigurálhatja, például ha a mező neve nem felel meg a fenti konvencióknak:

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

Mező- és tulajdonsághozzáférés

Alapértelmezés szerint az EF mindig beolvassa és beírja a háttérmezőbe – feltéve, hogy az egyik megfelelően van konfigurálva –, és soha nem fogja használni a tulajdonságot. Az EF azonban más hozzáférési mintákat is támogat. Az alábbi minta például arra utasítja az EF-t, hogy csak a materializálás során írjon a háttérmezőbe, és használja a tulajdonságot minden más esetben:

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

Tekintse meg a PropertyAccessMode enumerációt a támogatott beállítások teljes készletéért.

Csak mezőtulajdonságok

Létrehozhat olyan fogalmi tulajdonságot is a modellben, amely nem rendelkezik megfelelő CLR-tulajdonságtal az entitásosztályban, hanem egy mező használatával tárolja az adatokat az entitásban. Ez eltér az árnyéktulajdonságoktól, ahol az adatok a változáskövetésben vannak tárolva, nem pedig az entitás CLR-típusában. A csak mezőtulajdonságokat általában akkor használják, ha az entitásosztály tulajdonságok helyett metódusokat használ az értékek lekéréséhez/beállításához, vagy olyan esetekben, amikor a mezők egyáltalán nem lesznek közzétéve a tartománymodellben (pl. elsődleges kulcsok).

A csak mezős tulajdonság konfigurálásához adjon meg egy nevet az Property(...) API-ban:

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

Az EF megkísérli megkeresni a megadott névvel rendelkező CLR-tulajdonságot, vagy egy mezőt, ha egy tulajdonság nem található. Ha sem tulajdonság, sem mező nem található, ehelyett egy árnyéktulajdonság lesz beállítva.

Előfordulhat, hogy csak mezőtulajdonságra kell hivatkoznia a LINQ-lekérdezésekből, de az ilyen mezők általában privátak. A LINQ-lekérdezések metódusával EF.Property(...) hivatkozhat a mezőre:

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