シャドウ プロパティShadow Properties

Shadow プロパティは、.NET エンティティクラスで定義されていないが、EF Core モデルでそのエンティティ型に対して定義されているプロパティです。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.

外部キーのシャドウのプロパティForeign key shadow properties

シャドウプロパティは、外部キープロパティで最もよく使用されます。この場合、2つのエンティティ間のリレーションシップはデータベース内の外部キー値によって表されますが、リレーションシップはエンティティ型間のナビゲーションプロパティを使用してエンティティ型で管理されます。Shadow properties 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. 慣例により、EF はリレーションシップが検出されたときに、外部キープロパティが依存エンティティクラスに見つからない場合に shadow プロパティを導入します。By convention, EF will introduce a shadow property when a relationship is discovered but no foreign key property is found in the dependent entity class.

このプロパティにはという名前が付けられ <navigation property name><principal key property name> ます (これは、プリンシパルエンティティを指し示す依存エンティティのナビゲーションで、名前付けに使用されます)。The 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 shadow プロパティがエンティティに導入され 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; }

    // Since there is no CLR property which holds the foreign
    // key for this relationship, a shadow property is created.
    public Blog Blog { get; set; }
}

シャドウプロパティの構成Configuring shadow properties

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. 次の例では、 Blog にという名前の CLR プロパティがないため、 LastUpdated shadow プロパティが作成されています。In the following sample, since Blog has no CLR property named LastUpdated, a shadow property is created:

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; }
}

メソッドに指定された名前が Property 既存のプロパティの名前 (shadow プロパティまたは entity クラスで定義されているプロパティ) と一致する場合、コードは新しい shadow プロパティを導入するのではなく、既存のプロパティを構成します。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.

シャドウプロパティへのアクセスAccessing shadow properties

シャドウプロパティの値は、API を使用して取得および変更でき ChangeTracker ます。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"));

返されるエンティティは変更トラッカーによって追跡されないため、no tracking クエリの後にシャドウプロパティにアクセスすることはできません。Shadow properties cannot be accessed after a no-tracking query since the entities returned are not tracked by the change tracker.