Entity Framework
Наследование с помощью EntityFramework (сначала код)
Поиск…
Таблица на иерархию
Этот подход будет генерировать одну таблицу в базе данных для представления всей структуры наследования.
Пример:
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; }
Созданная таблица будет выглядеть следующим образом:
Таблица: Люди Поля: Идентификатор Имя Дата рождения Дискримитратор Входная плата JobDescription LastPurchaseDate TotalVisits
Если «Дискриминатор» будет содержать имя подкласса в наследовании, а «AdmissionDate», «JobDescription», «LastPurchaseDate», «TotalVisits», являются нулевыми.
преимущества
- Лучшая производительность, поскольку соединения не требуются, хотя для многих столбцов для базы данных может потребоваться много операций подкачки.
- Простой в использовании и создании
- Легко добавлять дополнительные подклассы и поля
Недостатки
- Нарушает 3-ей нормальную форму Википедия: Третья нормальная форма
- Создает множество полей с нулевым значением
Таблица на тип
Этот подход будет генерировать (n + 1) таблицы в базе данных для представления всей структуры наследования, где n - количество подклассов.
Как:
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; }
Созданная таблица будет выглядеть следующим образом:
Таблица: Люди Поля: Идентификатор Имя Дата рождения
Таблица: Поля сотрудников: PersonId AdmissionDate JobDescription
Таблица: Клиенты: Поля: PersonId LastPurchaseDate TotalVisits
Где «PersonId» на всех таблицах будет основным ключом и ограничением для People.Id
преимущества
- Нормализованные таблицы
- Легко добавлять столбцы и подклассы
- Нет нулевых столбцов
Недостатки
- Для получения данных требуется соединение
- Вывод подкласса более дорогой