継承 (リレーショナル データベース)Inheritance (Relational Database)

注意

このセクションの構成は、一般にリレーショナル データベースに適用されます。The configuration in this section is applicable to relational databases in general. ここで示すように拡張メソッドが使用可能になるリレーショナル データベース プロバイダーをインストールするときに (共有のためMicrosoft.EntityFrameworkCore.Relationalパッケージ)。The extension methods shown here will become available when you install a relational database provider (due to the shared Microsoft.EntityFrameworkCore.Relational package).

EF モデルでの継承を使用すると、データベース内のエンティティ クラスの継承の表現方法を制御します。Inheritance in the EF model is used to control how inheritance in the entity classes is represented in the database.

規則Conventions

規則では、継承をテーブルあたり階層 (TPH) パターンを使用してマップされます。By convention, inheritance will be mapped using the table-per-hierarchy (TPH) pattern. TPH では、1 つのテーブルを使用して、階層内のすべての種類のデータを格納します。TPH uses a single table to store the data for all types in the hierarchy. 識別子の列は、各行が表すどの種類の識別に使用します。A discriminator column is used to identify which type each row represents.

2 つまたは複数の継承された型がモデルで明示的に含まれている場合は、EF に継承はセットアップだけ (を参照してください継承詳細)。EF will only setup inheritance if two or more inherited types are explicitly included in the model (see Inheritance for more details).

以下には、単純な継承シナリオと TPH パターンを使用してリレーショナル データベースのテーブルに格納されたデータを示す例を示します。Below is an example showing a simple inheritance scenario and the data stored in a relational database table using the TPH pattern. 識別子列の種類を識別するブログは行ごとに格納します。The Discriminator column identifies which type of Blog is stored in each row.

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

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

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}

イメージ

データの注釈Data Annotations

データ注釈を使用して、継承を構成することはできません。You cannot use Data Annotations to configure inheritance.

Fluent APIFluent API

Fluent API を使用して、名前と識別子の列と、階層内の各型の識別に使用される値の型を構成することができます。You can use the Fluent API to configure the name and type of the discriminator column and the values that are used to identify each type in the hierarchy.

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasDiscriminator<string>("blog_type")
            .HasValue<Blog>("blog_base")
            .HasValue<RssBlog>("blog_rss");
    }
}

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

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}