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 ficarão disponíveis quando você instalar um provedor de banco de dados relacional (devido ao pacote Microsoft.EntityFrameworkCore.Relational compartilhado).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.

Observação

No momento, somente o padrão do tabela por hierarquia (TPH) é implementado no núcleo do EF.Currently, only the table-per-hierarchy (TPH) pattern is implemented in EF Core. Outros padrões comuns de tabela por tipo (TPT), como e -por-concreto-tipo de tabela (TPC) ainda não estão disponíveis.Other common patterns like table-per-type (TPT) and table-per-concrete-type (TPC) are not yet available.

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

Configurar a propriedade discriminatóriaConfiguring the discriminator property

Nos exemplos acima, o discriminador é criado como um sombra propriedade sobre a entidade básica da hierarquia.In the examples above, the discriminator is created as a shadow property on the base entity of the hierarchy. Como é uma propriedade no modelo, pode ser configurado como outras propriedades.Since it is a property in the model, it can be configured just like other properties. Por exemplo, para definir o tamanho máximo quando o padrão, o discriminador por convenção está sendo usado:For example, to set the max length when the default, by-convention discriminator is being used:

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

O discriminador também pode ser mapeado para uma propriedade CLR real em sua entidade.The discriminator can also be mapped to an actual CLR property in your entity. Por exemplo: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; }
}

Combinar essas duas coisas juntos é possível mapear o discriminador a uma propriedade real tanto configurá-lo: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");
});