Herança (banco de dados relacional)Inheritance (Relational Database)

Observação

A configuração nesta seção é aplicável a bancos de dados relacionais em geral.The configuration in this section is applicable to relational databases in general. Os métodos de extensão mostrados aqui estará disponíveis quando você instala um provedor de banco de dados relacional (devido a compartilhado Microsoft.EntityFrameworkCore.Relational pacote).The extension methods shown here will become available when you install a relational database provider (due to the shared Microsoft.EntityFrameworkCore.Relational package).

Herança no modelo EF é usada para controlar como a herança em classes de entidade é representada no banco de dados.Inheritance in the EF model is used to control how inheritance in the entity classes is represented in the database.

ConvençõesConventions

Por convenção, a herança será mapeada usando o padrão de tabela por hierarquia (TPH).By convention, inheritance will be mapped using the table-per-hierarchy (TPH) pattern. TPH usa uma única tabela para armazenar os dados para todos os tipos na hierarquia.TPH uses a single table to store the data for all types in the hierarchy. Uma coluna discriminatória é usada para identificar qual tipo de cada linha representa.A discriminator column is used to identify which type each row represents.

EF apenas configurar herança se dois ou mais tipos herdados estão explicitamente incluídos no modelo (consulte herança para obter mais detalhes).EF will only setup inheritance if two or more inherited types are explicitly included in the model (see Inheritance for more details).

Abaixo está um exemplo que mostra um cenário de herança simples e os dados armazenados em uma tabela de banco de dados relacional usando o padrão TPH.Below is an example showing a simple inheritance scenario and the data stored in a relational database table using the TPH pattern. O discriminador coluna identifica o tipo de Blog é armazenado em cada linha.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; }
}

imagem

Anotações de dadosData Annotations

Você não pode usar as anotações de dados para configurar a herança.You cannot use Data Annotations to configure inheritance.

API fluenteFluent API

Você pode usar a API fluente para configurar o nome e o tipo de coluna discriminadora e os valores que são usados para identificar cada tipo na hierarquia.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; }
}