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

注意

この機能は、EF Core 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"));