Pola zapasowegoBacking Fields

Uwaga

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

Pola zapasowy umożliwia 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 stosowania i/lub zwiększenia semantyki wokół dostęp do danych przez kod aplikacji, ale wartość powinna być odczytywać i/lub zapisane 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

Według Konwencji spowoduje odnalezienie następujących pól jak kopie pól dla danej właściwości (wymienione w kolejności priorytetu).By convention, the following fields will be discovered as backing fields for a given property (listed in precedence order). Pola są odnajdywane 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 tym & 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 materializowania wystąpień jednostek z bazy danych (a nie za pomocą metody ustawiającej 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ść w innym czasie, właściwość zostanie użyty, jeśli 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 musi zaktualizować wartości dla właściwości, zostanie użyty 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 zapisze do pola.If the property is read-only, then it will write to the field.

Adnotacji danychData Annotations

Tworzenie kopii pól nie można skonfigurować przy użyciu adnotacji danych.Backing fields cannot be configured with data annotations.

Interfejsu API FluentFluent API

Interfejsu API Fluent służy do konfigurowania 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 to pole jest używaneControlling when the field is used

Można skonfigurować podczas EF używa pola lub właściwości.You can configure when EF uses the field or property. Zobacz PropertyAccessMode wyliczenia dla obsługiwane opcje.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

Można też utworzyć właściwości koncepcyjnej w modelu, które nie mają odpowiednia 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. Różni się to od właściwości tle, gdy dane są przechowywane w śledzenie zmian.This is different from Shadow Properties, where the data is stored in the change tracker. To zazwyczaj będzie można użyć, 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.

Można nadać EF 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żna również podać właściwość nazwę inną 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żyć 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 składnika LINQ do odwoływania się do właściwości koncepcyjnie jest 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"));