Entity Framework
Overerving met EntityFramework (eerst code)
Zoeken…
Tabel per hiërarchie
Deze aanpak genereert één tabel in de database om de volledige overervingsstructuur weer te geven.
Voorbeeld:
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; }
De gegenereerde tabel is:
Tabel: Personen Velden: ID Naam Geboortedatum Discrimitator Toelatingsdatum Datum Functie Omschrijving Laatste Aankoop Datum Totaal Bezoeken
Waar 'Discriminator' de naam van de subklasse op de overerving zal behouden en 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', zijn 'TotalVisits' nulbaar.
voordelen
- Betere prestaties omdat geen joins nodig zijn, hoewel voor veel kolommen de database mogelijk veel paging-bewerkingen vereist.
- Eenvoudig te gebruiken en te maken
- Eenvoudig om meer subklassen en velden toe te voegen
nadelen
- Schendt de 3e normale vorm Wikipedia: derde normale vorm
- Creëert veel nulbare velden
Tabel per type
Deze benadering genereert (n + 1) tabellen in de database om alle overervingsstructuren weer te geven waarbij n het aantal subklassen is.
Hoe:
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; }
De gegenereerde tabel is:
Tabel: Personen Velden: ID Naam Geboortedatum
Tabel: Werknemersvelden: PersonId AdmissionDate JobDescription
Tabel: Klanten: Velden: PersonId LastPurchaseDate TotalVisits
Waar 'PersonId' op alle tabellen een primaire sleutel en een beperking voor People.Id zal zijn
voordelen
- Genormaliseerde tabellen
- Eenvoudig kolommen en subklassen toevoegen
- Geen nulbare kolommen
nadelen
- Lid worden is vereist om de gegevens op te halen
- Subklasse-gevolgtrekking is duurder