Dahinter liegenden FelderBacking Fields

Hinweis

Dieses Feature ist neu in EF Core 1.1.This feature is new in EF Core 1.1.

Dahinter liegenden Felder können EF lesen bzw. Schreiben auf ein Feld anstelle einer Eigenschaft an.Backing fields allow EF to read and/or write to a field rather than a property. Dies kann nützlich sein, wenn Kapselung in der Klasse beschränken die Verwendung von und/oder verbessern die Semantik für den Zugriff auf die Daten vom Anwendungscode verwendet wird, aber der Wert sollte lesen bzw. in die Datenbank geschrieben werden, ohne diese Einschränkungen werden / Erweiterungen.This can be useful when encapsulation in the class is being used to restrict the use of and/or enhance the semantics around access to the data by application code, but the value should be read from and/or written to the database without using those restrictions/enhancements.

KonventionenConventions

Gemäß der Konvention werden die folgenden Felder als unterstützungsfelder für eine bestimmte Eigenschaft (in ihrer Rangfolge aufgeführt) ermittelt.By convention, the following fields will be discovered as backing fields for a given property (listed in precedence order). Felder werden nur für Eigenschaften ermittelt, die im Modell enthalten sind.Fields are only discovered for properties that are included in the model. Weitere Informationen, die für die Eigenschaften im Modell enthalten sind, finden Sie unter einschließen und Ausschließen von Eigenschaften.For more information on which properties are included in the model, see Including & Excluding Properties.

  • _<camel-cased property name>
  • _<property name>
  • m_<camel-cased property name>
  • m_<property name>
public class Blog
{
    private string _url;

    public int BlogId { get; set; }

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

Wenn ein dahinter liegendes Feld konfiguriert ist, wird EF direkt in das Feld schreiben, bei der Umsetzung von Instanzen der Entität aus der Datenbank (anstatt den Eigenschaftensetter).When a backing field is configured, EF will write directly to that field when materializing entity instances from the database (rather than using the property setter). Wenn EF muss zum Lesen oder schreiben den Wert zu anderen Zeiten wird, wird nach Möglichkeit die Eigenschaft verwendet.If EF needs to read or write the value at other times, it will use the property if possible. Z. B. wenn EF den Wert für eine Eigenschaft zu aktualisieren muss, wird es Setter für die Eigenschaft verwenden, wenn eine definiert ist.For example, if EF needs to update the value for a property, it will use the property setter if one is defined. Wenn die Eigenschaft schreibgeschützt ist, wird es in das Feld schreiben.If the property is read-only, then it will write to the field.

DatenanmerkungenData Annotations

Unterstützungsfelder kann nicht mit datenanmerkungen konfiguriert werden.Backing fields cannot be configured with data annotations.

Fluent-APIFluent API

Sie können die Fluent-API verwenden, zum Konfigurieren eines unterstützungsfelds für eine Eigenschaft.You can use the Fluent API to configure a backing field for a property.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

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

public class Blog
{
    private string _validatedUrl;

    public int BlogId { get; set; }

    public string Url
    {
        get { return _validatedUrl; }
    }

    public void SetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            var response = client.GetAsync(url).Result;
            response.EnsureSuccessStatusCode();
        }

        _validatedUrl = url;
    }
}

Steuern, wenn das Feld verwendet wirdControlling when the field is used

Sie können konfigurieren, wenn EF Felds oder der Eigenschaft verwendet.You can configure when EF uses the field or property. Finden Sie unter den PropertyAccessMode Enum für die unterstützten Optionen.See the PropertyAccessMode enum for the supported options.

modelBuilder.Entity<Blog>()
    .Property(b => b.Url)
    .HasField("_validatedUrl")
    .UsePropertyAccessMode(PropertyAccessMode.Field);

Felder ohne eine EigenschaftFields without a property

Sie können auch eine grundlegende Eigenschaft in Ihrem Modell erstellen, die verfügt nicht über einen entsprechenden CLR-Eigenschaft in der Entitätsklasse, sondern ein Feld zum Speichern der Daten in der Entität verwendet.You can also create a conceptual property in your model that does not have a corresponding CLR property in the entity class, but instead uses a field to store the data in the entity. Dies unterscheidet sich von Schatteneigenschaften, in denen die Daten in der änderungsprotokollierung durchlief gespeichert werden.This is different from Shadow Properties, where the data is stored in the change tracker. Dies wird normalerweise verwendet, wenn die Entity-Klasse Methoden verwendet, um Get/Set-Werte.This would typically be used if the entity class uses methods to get/set values.

Sie erhalten EF den Namen des Felds in die Property(...) API.You can give EF the name of the field in the Property(...) API. Wenn keine Eigenschaft mit dem angegebenen Namen vorhanden ist, sieht dann EF für ein Feld.If there is no property with the given name, then EF will look for a field.

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

Sie können auch auswählen, um der Eigenschaft einen anderen Namen, als der Name des Felds zu gewähren.You can also choose to give the property a name, other than the field name. Dieser Name wird verwendet, wenn das Modell zu erstellen, sondern wird insbesondere verwendet werden, für den Namen der Spalte, der die in der Datenbank zugeordnet ist.This name is then used when creating the model, most notably it will be used for the column name that is mapped to in the database.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property<string>("Url")
        .HasField("_validatedUrl");
}

Wenn keine Eigenschaft in der Entitätsklasse vorhanden ist, können Sie mithilfe der EF.Property(...) -Methode in einer LINQ-Abfrage zum Verweisen auf die Eigenschaft, die konzeptionell Teil des Modells ist.When there is no property in the entity class, you can use the EF.Property(...) method in a LINQ query to refer to the property that is conceptually part of the model.

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