Entity Framework
Ereditarietà con EntityFramework (codice prima)
Ricerca…
Tabella per gerarchia
Questo approccio genererà una tabella sul database per rappresentare tutta la struttura di ereditarietà.
Esempio:
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 tabella generata sarà:
Tabella: Campi di persone: Nome ID Data di nascita Discrimitatore Data di ammissione Data Descrizione del lavoro Data ultima scadenza Totale visite
Dove "Discriminator" manterrà il nome della sottoclasse sull'ereditarietà e "AdmissionDate", "JobDescription", "LastPurchaseDate", "TotalVisits" sono annullabili.
vantaggi
- Prestazioni migliori in quanto non sono richiesti join, sebbene per molte colonne il database possa richiedere molte operazioni di paging.
- Semplice da usare e creare
- Facile aggiungere più sottoclassi e campi
svantaggi
- Violare la terza forma normale Wikipedia: terza forma normale
- Crea molti campi nullable
Tabella per tipo
Questo approccio genererà (n + 1) tabelle sul database per rappresentare tutta la struttura di ereditarietà in cui n è il numero di sottoclassi.
Come:
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 tabella generata sarà:
Tabella: Campi di persone: Nome ID Data di nascita
Tabella: Campi dipendenti: PersonId AdmissionDate JobDescription
Tabella: Clienti: Campi: PersonId LastPurchaseDate TotalVisits
Dove "PersonId" su tutte le tabelle sarà una chiave primaria e un vincolo per People.Id
vantaggi
- Tavoli normalizzati
- Facile aggiungere colonne e sottoclassi
- Nessuna colonna nullable
svantaggi
- Unire è necessario per recuperare i dati
- L'inferenza sottoclasse è più costosa