Entity Framework
Herencia con EntityFramework (primero el código)
Buscar..
Tabla por jerarquía
Este enfoque generará una tabla en la base de datos para representar toda la estructura de herencia.
Ejemplo:
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 tabla generada será:
Tabla: Campos de personas: Id. Nombre Fecha de nacimiento. Disimitador. Fecha de admisión. Fecha de trabajo. Descripción. Última compra. Fecha de visita. Total.
Donde 'Discriminador' guardará el nombre de la subclase en la herencia y 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits' son anulables.
Ventajas
- Mejor rendimiento ya que no se requieren combinaciones, aunque para muchas columnas la base de datos puede requerir muchas operaciones de paginación.
- Fácil de usar y crear
- Fácil de agregar más subclases y campos
Desventajas
- Viola la tercera forma normal de Wikipedia: tercera forma normal
- Crea lotes de campos anulables.
Tabla por tipo
Este enfoque generará (n + 1) tablas en la base de datos para representar toda la estructura de herencia donde n es el número de subclases.
Cómo:
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 tabla generada será:
Tabla: Campos de personas: Id. Nombre Fecha de nacimiento
Tabla: Campos de empleados: PersonId AdmissionDate JobDescription
Tabla: Clientes: Campos: PersonId LastPurchaseDate TotalVisits
Donde 'PersonId' en todas las tablas será una clave principal y una restricción para People.Id
Ventajas
- Tablas normalizadas
- Fácil de agregar columnas y subclases
- Columnas sin nulos
Desventajas
- Se requiere unirse para recuperar los datos
- La inferencia de subclases es más cara