Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core
В предыдущей теме два класса по сути относились к одной модели и хранились в одной таблице. Рассмотрим другую конфигурацию. Две модели связаны между собой, и было бы логично хранить их в одной таблице. В то же время мы можем оставить возможность работать с ними независимо друг от друга.
Чтобы две модели сохранялись в одну таблицу, они должны иметь между собой связь одни-ко-одному. а также иметь общий ключ. Например:
[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