Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Rückendeckungsfelder ermöglichen es EF, auf ein Feld zuzugreifen und/oder in ein Feld zu schreiben, anstatt auf eine Eigenschaft. Dies kann nützlich sein, wenn in der Klasse eine Kapselung verwendet wird, um den Zugriff auf die Daten durch Anwendungscode einzuschränken oder die Semantik des Zugriffs zu verbessern. Der Wert sollte jedoch ohne diese Einschränkungen oder Verbesserungen aus der Datenbank gelesen oder in diese geschrieben werden.
Grundlegende Konfiguration
Der Konvention nach werden die folgenden Felder als Rückfelder für eine bestimmte Eigenschaft (in der Rangfolge aufgeführt) erkannt.
<camel-cased property name>_<camel-cased property name>_<property name>m_<camel-cased property name>m_<property name>
Im folgenden Beispiel ist die Url, Eigenschaft so konfiguriert, dass sie _url als Rückfeld verwendet wird:
public class Blog
{
private string _url;
public int BlogId { get; set; }
public string Url
{
get { return _url; }
set { _url = value; }
}
}
Beachten Sie, dass Felder zur Unterstützung nur für Eigenschaften ermittelt werden, die im Modell enthalten sind. Weitere Informationen dazu, welche Eigenschaften im Modell enthalten sind, finden Sie unter Including & Excluding Properties.
Sie können Sicherungsfelder auch mithilfe einer Datenanmerkung oder der Fluent-API konfigurieren, z. B. wenn der Feldname nicht den oben genannten Konventionen entspricht:
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;
}
}
Feld- und Eigenschaftszugriff
Standardmäßig liest und schreibt EF immer in das Backfield - vorausgesetzt, eines wurde ordnungsgemäß konfiguriert - und nutzt niemals die Eigenschaft. EF unterstützt jedoch auch andere Zugriffsmuster. Im folgenden Beispiel wird z. B. EF angewiesen, nur während der Materialisierung in das Sicherungsfeld zu schreiben und die Eigenschaft in allen anderen Fällen zu verwenden:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasField("_validatedUrl")
.UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction);
}
Weitere Informationen sowie den vollständigen Satz der unterstützten Optionen finden Sie im Enum "PropertyAccessMode".
Nur-Feld-Eigenschaften
Sie können auch eine konzeptionelle Eigenschaft in Ihrem Modell erstellen, die nicht über eine entsprechende CLR-Eigenschaft in der Entitätsklasse verfügt, sondern stattdessen ein Feld verwendet, um die Daten in der Entität zu speichern. Dies unterscheidet sich von Schatteneigenschaften, bei denen die Daten im Änderungstracker gespeichert werden, und nicht im CLR-Typ der Entität. Nur-Feld-Eigenschaften werden häufig verwendet, wenn die Entitätsklasse Methoden anstelle von Eigenschaften zum Abrufen/Festlegen von Werten verwendet, oder in Fällen, in denen Felder nicht überhaupt im Domänenmodell verfügbar gemacht werden sollen (z. B. Primärschlüssel).
Sie können eine Nur-Feld-Eigenschaft konfigurieren, indem Sie einen Namen in der Property(...) API angeben:
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 versucht, eine CLR-Eigenschaft mit dem angegebenen Namen oder ein Feld zu finden, wenn eine Eigenschaft nicht gefunden wird. Wenn weder eine Eigenschaft noch ein Feld gefunden werden, wird stattdessen eine Schatteneigenschaft eingerichtet.
Möglicherweise müssen Sie in LINQ-Abfragen auf eine ausschließlich für Felder vorgesehene Eigenschaft verweisen, aber normalerweise sind solche Felder privat. Sie können die EF.Property(...) Methode in einer LINQ-Abfrage verwenden, um auf das Feld zu verweisen:
var blogs = db.blogs.OrderBy(b => EF.Property<string>(b, "_validatedUrl"));