Entity Framework
Vererbung mit EntityFramework (Code First)
Suche…
Tabelle pro Hierarchie
Dieser Ansatz generiert eine Tabelle in der Datenbank, die die gesamte Vererbungsstruktur darstellt.
Beispiel:
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; }
Die generierte Tabelle wird sein:
Tabelle: Personen Felder: ID Name Geburtsdatum Discrimitator ZulassungDatum JobDescription LastPurchaseDate Gesamtbesichtigungen
Wo 'Discriminator' den Namen der Unterklasse für die Vererbung enthält und 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits' sind nullbar.
Vorteile
- Bessere Leistung, da keine Joins erforderlich sind, obwohl die Datenbank für viele Spalten viele Paging-Vorgänge erfordern kann.
- Einfach zu bedienen und zu erstellen
- Einfach weitere Unterklassen und Felder hinzufügen
Nachteile
- Verstößt gegen die 3. Normalform Wikipedia: Dritte Normalform
- Erzeugt viele nullfähige Felder
Tabelle pro Typ
Dieser Ansatz generiert (n + 1) Tabellen in der Datenbank, um die gesamte Vererbungsstruktur darzustellen, wobei n die Anzahl der Unterklassen ist.
Wie man:
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; }
Die generierte Tabelle wird sein:
Tabelle: Personenfelder: Id-Name Geburtsdatum
Tabelle: Mitarbeiterfelder: PersonId AdmissionDate JobDescription
Tabelle: Kunden: Felder: PersonId LastPurchaseDate Gesamtbesichtigungen
Wobei 'PersonId' in allen Tabellen ein Primärschlüssel und eine Einschränkung für People.Id ist
Vorteile
- Normalisierte Tabellen
- Spalten und Unterklassen einfach hinzuzufügen
- Keine nullfähigen Spalten
Nachteile
- Join ist erforderlich, um die Daten abzurufen
- Unterklassenschluss ist teurer