Pola zapasoweBacking Fields

Uwaga

Ta funkcja jest nowa w programie EF Core 1.1.This feature is new in EF Core 1.1.

Pola zapasowego umożliwiają EF do odczytu lub zapisu do pola, a nie właściwości.Backing fields allow EF to read and/or write to a field rather than a property. Może to być przydatne, gdy hermetyzacji klasy jest używany do ograniczenia użytkowania i/lub zwiększ semantykę dostępu do danych przez kod aplikacji, ale wartość powinna być odczytywać i/lub zapisywanych w bazie danych bez korzystania z tych ograniczeń / ulepszenia.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.

KonwencjeConventions

Zgodnie z Konwencją następujące pola zostaną odnalezione jak kopie pól dla danej właściwości (wymienione w kolejność pierwszeństwa).By convention, the following fields will be discovered as backing fields for a given property (listed in precedence order). Pola odnajdywane będą tylko dla właściwości, które znajdują się w modelu.Fields are only discovered for properties that are included in the model. Aby uzyskać więcej informacji, na którym właściwości znajdują się w modelu, zobacz uwzględnianie i wykluczanie właściwości.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; }
    }
}

Po skonfigurowaniu polem zapasowym EF zapisze bezpośrednio do tego pola, gdy materializowanie wystąpień jednostek w bazie danych (zamiast przy użyciu metoda ustawiająca właściwości).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). Jeśli EF musi odczytać lub zapisać wartości w pozostałych godzinach, właściwość zostanie użyty, jeśli jest to możliwe.If EF needs to read or write the value at other times, it will use the property if possible. Na przykład jeśli EF należy zaktualizować wartość właściwości go użyje metoda ustawiająca właściwości, jeśli jest zdefiniowana.For example, if EF needs to update the value for a property, it will use the property setter if one is defined. Jeśli właściwość jest tylko do odczytu, następnie go zapisuje do pola.If the property is read-only, then it will write to the field.

Adnotacje danychData Annotations

Pola zapasowe nie można skonfigurować przy użyciu adnotacji danych.Backing fields cannot be configured with data annotations.

Interfejs Fluent APIFluent API

Interfejs Fluent API umożliwiają skonfigurowanie z polem zapasowym dla właściwości.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;
    }
}

Kontrolowanie, gdy pole jest używaneControlling when the field is used

Można skonfigurować, kiedy EF używa pola lub właściwości.You can configure when EF uses the field or property. Zobacz wyliczenia PropertyAccessMode obsługiwanych opcjach.See the PropertyAccessMode enum for the supported options.

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

Pola bez właściwościFields without a property

Ogólne właściwości można też utworzyć w modelu nie ma odpowiadającą właściwość CLR w klasie jednostki, ale zamiast tego używa pola do przechowywania danych w jednostce.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. To różni się od właściwości w tle, której dane są przechowywane w śledzenie zmian.This is different from Shadow Properties, where the data is stored in the change tracker. To wykorzystania, jeśli klasa jednostki używa metody do pobierania/ustawiania wartości.This would typically be used if the entity class uses methods to get/set values.

EF można nadać nazwę pola w Property(...) interfejsu API.You can give EF the name of the field in the Property(...) API. Jeśli nie ma właściwości o podanej nazwie, EF będzie wyglądać dla pola.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;
    }
}

Możesz również podać właściwość nazwę, inna niż nazwa pola.You can also choose to give the property a name, other than the field name. Ta nazwa jest następnie używana podczas tworzenia modelu, głównie będzie można używać dla nazwy kolumny, który jest mapowany w bazie danych.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");
}

Jeśli nie ma właściwości w klasie jednostki, możesz użyć EF.Property(...) metody w zapytaniu programu LINQ do odwoływania się do właściwości, pod względem koncepcyjnym będącej częścią modelu.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"));