Entity Framework
Héritage avec EntityFramework (Code First)
Recherche…
Tableau par hiérarchie
Cette approche va générer une table sur la base de données pour représenter toute la structure d'héritage.
Exemple:
public abstract class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}
public class Employee : Person
{
public DateTime AdmissionDate { get; set; }
public string JobDescription { get; set; }
}
public class Customer : Person
{
public DateTime LastPurchaseDate { get; set; }
public int TotalVisits { get; set; }
}
// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }
La table générée sera:
Tableau: Champs de personnes: Nom de l'identifiant BirthDate Discrimitator AdmissionDate JobDescription LastPurchaseDate TotalVisits
Où 'Discriminator' contiendra le nom de la sous-classe sur l'héritage et 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits' sont nullables.
Avantages
- De meilleures performances, car aucune jointure n'est requise, mais pour de nombreuses colonnes, la base de données peut nécessiter de nombreuses opérations de pagination.
- Simple à utiliser et à créer
- Facile d'ajouter plus de sous-classes et de champs
Désavantages
- Viole la 3ème forme normale Wikipedia: troisième forme normale
- Crée beaucoup de champs nullables
Tableau par type
Cette approche génère des tables (n + 1) sur la base de données pour représenter toute la structure d'héritage où n est le nombre de sous-classes.
Comment:
public abstract class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}
[Table("Employees")]
public class Employee : Person
{
public DateTime AdmissionDate { get; set; }
public string JobDescription { get; set; }
}
[Table("Customers")]
public class Customer : Person
{
public DateTime LastPurchaseDate { get; set; }
public int TotalVisits { get; set; }
}
// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }
La table générée sera:
Tableau: Champs de personnes: Nom de l'identifiant Date de naissance
Tableau: Champs Employees: PersonId AdmissionDate JobDescription
Table: Customers: Champs: PersonId LastPurchaseDate TotalVisits
Où 'PersonId' sur toutes les tables sera une clé primaire et une contrainte pour People.Id
Avantages
- Tables normalisées
- Facile à ajouter des colonnes et des sous-classes
- Aucune colonne nullable
Désavantages
- Join est nécessaire pour récupérer les données
- L'inférence de sous-classe est plus chère