Наследование в Entity Framework

Подход TPH

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core

Последнее обновление: 31.10.2015

При использовании подхода TPH (Table Per Hierarchy / Таблица на одну иерархию классов) для одной иерархии классов используется одна таблица. Данные базовых и производных классов сохраняются в одну таблицу, а для их отличия создается специальный столбец.

Например, создадим мини-иерархию из двух классов:

public class Phone
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }
}

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; }
}

Здесь класс Smartphone наследуется от Phone, определяя одно свойство в дополнение к унаследованным. И при работе будет создана такая таблица:

Inheritance in Entity Framework

Кроме всех свойств классов Phone и Smartphone здесь также появляется еще один столбец - Discriminator. Он имеет тип nvarchar (то есть строка) и имеет длину в 128 символов. Данный столбец и будет определять относится строка к типу Phone или Smartphone.

Теперь используем в программе:

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);
}

Также обратите внимание на вывод консоли:

Наследование in Entity Framework

Так как объект Smartphone также является и объектом Phone, то он также извлекается через db.Phones.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850