バッキング フィールドBacking Fields

注意

この機能は、EF コア 1.1 の新機能です。This feature is new in EF Core 1.1.

バッキング フィールドには、読み取りまたは書き込みのプロパティではなく、フィールドを行う EF ができるようにします。Backing fields allow EF to read and/or write to a field rather than a property. これを利用するクラスにカプセル化は、アプリケーション コードでの使用を制限したり、データへのアクセスの周囲のセマンティクスを強化する使用されているが、値の読み取りまたはその制限を使用せずに、データベースに書き込まれる必要があります/拡張機能です。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.

規則Conventions

慣例により、バックアップする (優先順位順に表示されます)、指定したプロパティ フィールドとして、次のフィールドが検出されます。By convention, the following fields will be discovered as backing fields for a given property (listed in precedence order). フィールドは、モデルに含まれているプロパティに対してのみ検出されます。Fields are only discovered for properties that are included in the model. 詳細については、モデルに含まれるプロパティを次を参照してください。などとプロパティを除外です。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; }
    }
}

バッキング フィールドが構成されている場合、EF は、(プロパティ set アクセス操作子を使用するのではなく) データベースからのエンティティのインスタンスを具体化する場合にそのフィールドに直接書き込まれます。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). EF を他のタイミングで値を読み取ったり書き込んだりする場合は、可能であれば、プロパティが使用されます。If EF needs to read or write the value at other times, it will use the property if possible. たとえば、EF プロパティの値を更新する場合は、使用されますプロパティ set アクセス操作子が定義されている場合。For example, if EF needs to update the value for a property, it will use the property setter if one is defined. プロパティが読み取り専用である場合は、フィールドに書き込まれます。If the property is read-only, then it will write to the field.

データの注釈Data Annotations

データ注釈を使用したフィールドをバックアップを構成することはできません。Backing fields cannot be configured with data annotations.

Fluent APIFluent API

Fluent API を使用して、プロパティのバッキング フィールドを構成することができます。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;
    }
}

フィールドを使用する場合を制御します。Controlling when the field is used

EF フィールドまたはプロパティを使用する場合を構成することができます。You can configure when EF uses the field or property. 参照してください、 PropertyAccessMode enum用にサポートされるオプションです。See the PropertyAccessMode enum for the supported options.

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

プロパティ フィールドFields without a property

エンティティ クラスに対応する CLR プロパティはありませんが、代わりに、エンティティにデータを格納するフィールドを使用するモデルの概念プロパティを作成することもできます。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. これとは異なるプロパティをシャドウ、変更トラッカーのデータを格納する場所です。This is different from Shadow Properties, where the data is stored in the change tracker. これは通常される使用、そのエンティティ クラスでは、メソッドを使用して、値を取得または設定する場合。This would typically be used if the entity class uses methods to get/set values.

EF 内のフィールドの名前を指定する、 Property(...) API です。You can give EF the name of the field in the Property(...) API. 場合は、指定した名前のプロパティがない、EF はフィールドのなります。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;
    }
}

プロパティ、フィールド名以外の名前を入力することもできます。You can also choose to give the property a name, other than the field name. この名前は、モデルを作成するときに使用し、データベース内にマップされている列の名前を使用する最も顕著なです。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");
}

エンティティ クラスでプロパティがない場合は、使用できます、EF.Property(...)概念的には、モデルの一部であるプロパティを参照する LINQ クエリ内のメソッドです。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"));