Две модели в одной таблице

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

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

В предыдущей теме два класса по сути относились к одной модели и хранились в одной таблице. Рассмотрим другую конфигурацию. Две модели связаны между собой, и было бы логично хранить их в одной таблице. В то же время мы можем оставить возможность работать с ними независимо друг от друга.

Чтобы две модели сохранялись в одну таблицу, они должны иметь между собой связь одни-ко-одному. а также иметь общий ключ. Например:

[Table("Mobiles")]
public class PhoneInfo
{
    [Key, ForeignKey("Phone")]
    public int PhoneId { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }

    public Phone Phone { get; set; }
}

[Table("Mobiles")]
public class Phone
{
    [Key, ForeignKey("Info")]
    public int PhoneId { get; set; }
    public string Name { get; set; }

    public PhoneInfo Info { get; set; }
}

class MobileContext : DbContext
{
    public MobileContext() : base("DefaultConnection")
    { }
    
	public DbSet<Phone> Phones { get; set; }
    public DbSet<PhoneInfo> Infos { get; set; }
}

Модели Phone и PnoneInfo имеют один и тот же первичный ключ, который также выполняет роль внешнего ключа. В итоге сформируется следующая таблица:

Использование моделей:

using(MobileContext db = new MobileContext())
{
    PhoneInfo pi1 = new PhoneInfo { PhoneId=1, Company = "Samsung", Price = 14000};
    PhoneInfo pi2 = new PhoneInfo { PhoneId = 2, Company = "Nokia", Price = 8000};
            
    Phone p1 = new Phone { PhoneId = 1, Name = "Samsung Galaxy S5", Info = pi1 };
    Phone p2 = new Phone { PhoneId = 2, Name = "Nokia Lumia 630", Info = pi2};
    
    db.Infos.Add(pi1);
    db.Infos.Add(pi2);
    db.Phones.Add(p1);
    db.Phones.Add(p2);
    db.SaveChanges();
    
	foreach (Phone p in db.Phones.Include(p=>p.Info))
        Console.WriteLine("{0} ({1}) - {2}", p.Name, p.Info.Company, p.Info.Price);
}

Результатом работы программы будет следующий вывод:

Samsung Galaxy S5 (Samsung) - 14000
Nokia Lumia 630 (Nokia) - 8000
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850