Vererbung (relationale Datenbank)Inheritance (Relational Database)

Hinweis

Die Konfiguration in diesem Abschnitt gilt allgemein für relationale Datenbanken.The configuration in this section is applicable to relational databases in general. Die hier gezeigten Erweiterungsmethoden werden verfügbar, wenn Sie einen relationalen Datenbankanbieter installieren (aufgrund des gemeinsam genutzten Pakets 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).

Vererbung in das EF-Modell dient zum Steuern, wie die Vererbung in Entitätsklassen in der Datenbank dargestellt wird.Inheritance in the EF model is used to control how inheritance in the entity classes is represented in the database.

Hinweis

Derzeit wird nur die Tabelle pro Hierarchie (TPH)-Muster in EF Core implementiert.Currently, only the table-per-hierarchy (TPH) pattern is implemented in EF Core. Weitere allgemeine Muster wie die Tabelle pro Typ (TPT) und Tabelle pro konkreten-Typ (TPC) sind noch nicht verfügbar.Other common patterns like table-per-type (TPT) and table-per-concrete-type (TPC) are not yet available.

KonventionenConventions

Gemäß der Konvention wird Vererbung mit dem Muster für die Tabelle pro Hierarchie (TPH) zugeordnet werden.By convention, inheritance will be mapped using the table-per-hierarchy (TPH) pattern. TPH verwendet eine einzelne Tabelle, um die Daten für alle Typen in der Hierarchie zu speichern.TPH uses a single table to store the data for all types in the hierarchy. Eine Diskriminatorspalte wird verwendet, um welche Art zu identifizieren, jede Zeile steht.A discriminator column is used to identify which type each row represents.

EF Core wird nur die Vererbung eingerichtet, wenn mindestens zwei geerbte Typen explizit in das Modell enthalten sind (finden Sie unter Vererbung Weitere Details).EF Core will only setup inheritance if two or more inherited types are explicitly included in the model (see Inheritance for more details).

Im folgenden finden ein Beispiel für ein Szenario für die einfache Vererbung und die Daten, die in einer relationalen Datenbanktabelle, die mit dem TPH-Muster.Below is an example showing a simple inheritance scenario and the data stored in a relational database table using the TPH pattern. Die Diskriminator Spalte identifiziert, welche Art von Blog in jeder Zeile gespeichert wird.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; }
}

Bild

DatenanmerkungenData Annotations

Sie können nicht von Datenanmerkungen verwenden, die Vererbung konfigurieren.You cannot use Data Annotations to configure inheritance.

Fluent-APIFluent API

Sie können die Fluent-API verwenden, konfigurieren Sie den Namen und Typ der Unterscheidungsspalte und die Werte, die verwendet werden, um jeden Typ in der Hierarchie zu identifizieren.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; }
}

Konfigurieren von UnterscheidungseigenschaftConfiguring the discriminator property

In den Beispielen oben wird als Diskriminator erstellt eine schatteneigenschaft auf der Basisentität der Hierarchie.In the examples above, the discriminator is created as a shadow property on the base entity of the hierarchy. Da es sich um eine Eigenschaft im Modell ist, können sie genau wie andere Eigenschaften konfiguriert werden.Since it is a property in the model, it can be configured just like other properties. Geben Sie beispielsweise Folgendes ein, um die maximale Länge festgelegt werden, wenn die Standardeinstellung, nach Konvention Diskriminator verwendet wird:For example, to set the max length when the default, by-convention discriminator is being used:

modelBuilder.Entity<Blog>()
    .Property("Discriminator")
    .HasMaxLength(200);

Die Unterscheidung kann auch auf eine tatsächliche CLR-Eigenschaft in der Entität zugeordnet werden.The discriminator can also be mapped to an actual CLR property in your entity. Zum Beispiel:For example:

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasDiscriminator<string>("BlogType");
    }
}

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

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

Kombinieren diese beiden Schritte ist es möglich, sowohl die Unterscheidung einer Echtzeit-Eigenschaft zugeordnet, und konfigurieren Sie sie:Combining these two things together it is possible to both map the discriminator to a real property and configure it:

modelBuilder.Entity<Blog>(b =>
{
    b.HasDiscriminator<string>("BlogType");

    b.Property(e => e.BlogType)
        .HasMaxLength(200)
        .HasColumnName("blog_type");
});