プロパティをシャドウShadow Properties

シャドウのプロパティは、.NET エンティティ クラスで定義されていないが、EF の主要なモデルでは、そのエンティティ型に対して定義されているプロパティです。Shadow properties are properties that are not defined in your .NET entity class but are defined for that entity type in the EF Core model. 変更トラッカーの純粋値とこれらのプロパティの状態が維持されます。The value and state of these properties is maintained purely in the Change Tracker.

シャドウのプロパティは、マップされているエンティティ型で公開する必要がないデータベース内のデータがある場合に便利です。Shadow properties are useful when there is data in the database that should not be exposed on the mapped entity types. ほとんどの場合、データベースの外部キーの値で表される 2 つのエンティティ間のリレーションシップは、リレーションシップは、エンティティ型の間のナビゲーション プロパティを使用してエンティティの種類で管理されていますが、外部キー プロパティの使用されます。They are most often used for foreign key properties, where the relationship between two entities is represented by a foreign key value in the database, but the relationship is managed on the entity types using navigation properties between the entity types.

シャドウ プロパティの値を入手して使用して変更することができます、 ChangeTracker API です。Shadow property values can be obtained and changed through the ChangeTracker API.

   context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;

プロパティをシャドウを使用した LINQ クエリで参照できる、EF.Property静的メソッドです。Shadow properties can be referenced in LINQ queries via the EF.Property static method.

var blogs = context.Blogs
    .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));

規則Conventions

リレーションシップが検出されますが、依存エンティティ クラスの外部キーのプロパティが見つからないときに、慣例によりシャドウのプロパティを作成できます。Shadow properties can be created by convention when a relationship is discovered but no foreign key property is found in the dependent entity class. この場合、シャドウ外部キーのプロパティが導入されます。In this case, a shadow foreign key property will be introduced. シャドウの外部キー プロパティの名前は<navigation property name><principal key property name>(プリンシパル エンティティを指す、依存エンティティのナビゲーションは、名前付けの使用)。The shadow foreign key property will be named <navigation property name><principal key property name> (the navigation on the dependent entity, which points to the principal entity, is used for the naming). プリンシパル キー プロパティ名がナビゲーション プロパティの名前を含むかどうかは、名前は単なる<principal key property name>です。If the principal key property name includes the name of the navigation property, then the name will just be <principal key property name>. 依存エンティティにナビゲーション プロパティがない場合、プリンシパルの種類名は、代わりに使用されます。If there is no navigation property on the dependent entity, then the principal type name is used in its place.

たとえば、次のコード リストが結果のBlogIdシャドウ プロパティに導入する際に、Postエンティティです。For example, the following code listing will result in a BlogId shadow property being introduced to the Post entity.

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

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

データの注釈Data Annotations

データ注釈を使用したプロパティをシャドウを作成できません。Shadow properties can not be created with data annotations.

Fluent APIFluent API

Fluent API を使用して、シャドウ プロパティを構成することができます。You can use the Fluent API to configure shadow properties. 文字列のオーバー ロードを呼び出した後Property他のプロパティは構成の呼び出しのいずれかにチェーンすることができます。Once you have called the string overload of Property you can chain any of the configuration calls you would for other properties.

名前を指定する場合、Propertyメソッド (シャドウ プロパティまたはエンティティ クラスで定義されているいずれか)、既存のプロパティの名前に一致し、コードで新しいシャドウ プロパティを導入するのではなく、その既存のプロパティが設定されます。If the name supplied to the Property method matches the name of an existing property (a shadow property or one defined on the entity class), then the code will configure that existing property rather than introducing a new shadow property.

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("LastUpdated");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}