Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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"));