Dziedziczenie (relacyjna baza danych)Inheritance (Relational Database)

Uwaga

Ogólnie rzecz biorąc jest odpowiednie dla relacyjnych baz danych konfiguracji w tej sekcji.The configuration in this section is applicable to relational databases in general. Metody rozszerzenia, pokazane tutaj staną się dostępne po zainstalowaniu dostawcy relacyjnej bazy danych (z powodu udostępnionej Microsoft.EntityFrameworkCore.Relational pakietu).The extension methods shown here will become available when you install a relational database provider (due to the shared Microsoft.EntityFrameworkCore.Relational package).

Dziedziczenie w modelu platformy EF jest używane do kontrolowania, jak dziedziczenia klas jednostek jest reprezentowana w bazie danych.Inheritance in the EF model is used to control how inheritance in the entity classes is represented in the database.

Uwaga

Obecnie tylko tabela wg hierarchii (TPH) ze wzorcem jest zaimplementowana w wersji EF Core.Currently, only the table-per-hierarchy (TPH) pattern is implemented in EF Core. Innych typowych wzorców, takich jak tabela wg typu (TPT), a tabela konkretny-wg typu (TPC) nie są jeszcze dostępne.Other common patterns like table-per-type (TPT) and table-per-concrete-type (TPC) are not yet available.

KonwencjeConventions

Zgodnie z Konwencją dziedziczenia zostanie zamapowane przy użyciu wzorca Tabela wg hierarchii (TPH).By convention, inheritance will be mapped using the table-per-hierarchy (TPH) pattern. TPH używa jednej tabeli do przechowywania danych dla wszystkich typów w hierarchii.TPH uses a single table to store the data for all types in the hierarchy. Kolumna dyskryminatora jest używany do identyfikowania typu każdy wiersz reprezentuje.A discriminator column is used to identify which type each row represents.

EF Core tylko skonfigurować dziedziczenie, jeśli co najmniej dwa dziedziczone typy są jawnie uwzględnione w modelu (zobacz dziedziczenia Aby uzyskać więcej informacji).EF Core will only setup inheritance if two or more inherited types are explicitly included in the model (see Inheritance for more details).

Poniżej przedstawiono przykład przedstawiający Scenariusz proste dziedziczenie i dane przechowywane w tabeli relacyjnej bazy danych za pomocą wzorca TPH.Below is an example showing a simple inheritance scenario and the data stored in a relational database table using the TPH pattern. Dyskryminatora kolumna określa, jakiego typu blogu są przechowywane w każdym wierszu.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; }
}

obraz

Adnotacje danychData Annotations

Nie można użyć adnotacji danych, aby skonfigurować dziedziczenie.You cannot use Data Annotations to configure inheritance.

Interfejs Fluent APIFluent API

Interfejs Fluent API umożliwiają skonfigurowanie nazwy i typu kolumna dyskryminatora i wartości, które są używane do identyfikowania poszczególnych typów w hierarchii.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; }
}

Konfigurowanie właściwość rozróżniaczaConfiguring the discriminator property

W powyższych przykładach dyskryminatora jest tworzona jako w tle właściwość na podstawowej jednostce w hierarchii.In the examples above, the discriminator is created as a shadow property on the base entity of the hierarchy. Ponieważ właściwości w modelu, można skonfigurować tak jak inne właściwości.Since it is a property in the model, it can be configured just like other properties. Na przykład, aby ustawić maksymalną długość, gdy jest używany domyślnie przez Konwencję dyskryminatora:For example, to set the max length when the default, by-convention discriminator is being used:

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

Rozróżniacza również mogą być mapowane z właściwością rzeczywiste CLR w jednostce.The discriminator can also be mapped to an actual CLR property in your entity. Na przykład: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; }
}

Łącząc te dwie rzeczy ze sobą istnieje możliwość zarówno mapy rozróżniacza z właściwością rzeczywistym i skonfiguruj go tak: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");
});