Héritage (base de données relationnelle)Inheritance (Relational Database)

Note

La configuration indiquée dans cette section s’applique aux bases de données relationnelles en général.The configuration in this section is applicable to relational databases in general. Les méthodes d’extension indiquées ici sont disponibles quand vous installez un fournisseur de base de données relationnelle (en raison du package partagé 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).

L’héritage dans le modèle EF est utilisé pour contrôler la façon dont l’héritage dans les classes d’entité est représentée dans la base de données.Inheritance in the EF model is used to control how inheritance in the entity classes is represented in the database.

Note

Actuellement, uniquement le table par hiérarchie (TPH) implémentation du modèle dans EF Core.Currently, only the table-per-hierarchy (TPH) pattern is implemented in EF Core. Autres modèles courants tels que table par type (TPT) et table par-type concret (TPC) ne sont pas encore disponibles.Other common patterns like table-per-type (TPT) and table-per-concrete-type (TPC) are not yet available.

ConventionsConventions

Par convention, l’héritage sera mappé à l’aide du modèle de table par hiérarchie (TPH).By convention, inheritance will be mapped using the table-per-hierarchy (TPH) pattern. TPH utilise une seule table pour stocker les données pour tous les types dans la hiérarchie.TPH uses a single table to store the data for all types in the hierarchy. Une colonne de discriminateur est utilisée pour identifier le type de chaque ligne représente.A discriminator column is used to identify which type each row represents.

EF Core va installer uniquement l’héritage si deux ou plusieurs types hérités sont explicitement inclus dans le modèle (voir héritage pour plus d’informations).EF Core will only setup inheritance if two or more inherited types are explicitly included in the model (see Inheritance for more details).

Voici un exemple d’un scénario simple d’héritage et les données stockées dans une table de base de données relationnelle à l’aide du modèle TPH.Below is an example showing a simple inheritance scenario and the data stored in a relational database table using the TPH pattern. Le discriminateur colonne identifie le type de Blog est stocké dans chaque ligne.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; }
}

image

Annotations de donnéesData Annotations

Vous ne pouvez pas utiliser des Annotations de données pour configurer l’héritage.You cannot use Data Annotations to configure inheritance.

API FluentFluent API

Vous pouvez utiliser l’API Fluent pour configurer le nom et le type de la colonne de discriminateur et les valeurs qui sont utilisées pour identifier chaque type dans la hiérarchie.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; }
}

Configuration de la propriété de discriminateurConfiguring the discriminator property

Dans les exemples ci-dessus, le discriminateur est créé comme un occulter propriété sur l’entité de base de la hiérarchie.In the examples above, the discriminator is created as a shadow property on the base entity of the hierarchy. S’agissant d’une propriété dans le modèle, il peut être configuré comme d’autres propriétés.Since it is a property in the model, it can be configured just like other properties. Par exemple, pour définir la longueur maximale, lorsque la valeur par défaut, les discriminateur par convention est utilisée :For example, to set the max length when the default, by-convention discriminator is being used:

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

Le discriminateur peut également être mappé à une propriété CLR réelle de l’entité.The discriminator can also be mapped to an actual CLR property in your entity. Exemple :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; }
}

Combinant ces deux opérations, il est possible de mapper le discriminateur à une propriété réelle et le configurer :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");
});