Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core
Подход TPT (Table Per Type / Таблица на тип) предполагает сохранение в общей таблице только тех свойств, которые общие для всех классов-наследников, то есть которые определены в базовом классе. А те свойства, которые относятся только к производному классу, сохраняются в отдельной таблице.
Чтобы применить подход, возьмем из предыдущего примера систему классов и добавим к классу Smartphone атрибут Table:
public class Phone { public int Id { get; set; } public string Name { get; set; } public string Company { get; set; } public int Price { get; set; } } [Table("Smartphones")] public class Smartphone : Phone { public string OS { get; set; } } class MobileContext : DbContext { public MobileContext() : base("DefaultConnection") { } public DbSet<Phone> Phones { get; set; } public DbSet<Smartphone> Smarts { get; set; } }
Все остальное остается также, как и при подходе TPH. Но теперь база данных будет содержать следующие таблицы:
Таблица для смартфонов содержит только оно поле OS, а также ключ Id для связи с таблицей Phones.
Применение моделей будет аналогично подходу TPH:
using(MobileContext db = new MobileContext()) { db.Phones.Add(new Phone {Name = "Samsung Galaxy S5", Company = "Samsung", Price = 14000 }); db.Phones.Add(new Phone {Name = "Nokia Lumia 630", Company = "Nokia", Price = 8000 }); Smartphone s1 = new Smartphone { Name = "iPhone 6", Company = "Apple", Price = 32000, OS = "iOS" }; db.Smarts.Add(s1); db.SaveChanges(); foreach (Phone p in db.Phones) Console.WriteLine("{0} ({1}) - {2}", p.Name, p.Company, p.Price); Console.WriteLine(); foreach (Smartphone p in db.Smarts) Console.WriteLine("{0} ({1}, {2}) - {3}", p.Name, p.Company, p.Price, p.OS); }