Наследование позволяет создавать сложные модели, которые лучше отражают взгляды разработчиков, а также сокращают объем работы, необходимой для взаимодействия с этими моделями. Наследование, используемое с сущностями, служит той же цели, что и наследование, используемое с классами, поэтому разработчики уже знают основы работы этой функции.
Давайте рассмотрим следующий пример и создадим новый проект консольного приложения.
Шаг 1 — Добавьте ADO.NET Entity Data Model, щелкнув правой кнопкой мыши на имени проекта и выбрав Add → New Item…
Шаг 2 — Добавьте одну сущность и назовите ее «Персона», выполнив все шаги, упомянутые в главе «Модель первый подход».
Шаг 3 — Добавьте некоторые скалярные свойства, как показано на следующем рисунке.
Шаг 4 — Мы добавим еще две сущности Ученик и Учитель , которые унаследуют свойства от Персональной таблицы.
Шаг 5 — Теперь добавьте сущность Student и выберите Person из выпадающего списка базового типа, как показано на следующем рисунке.
Шаг 6 — Аналогичным образом добавьте сущность Учитель.
Шаг 7. Теперь добавьте скалярное свойство EnrollmentDate к сущности учащегося и свойство HireDate к сущности учителя.
Шаг 8 — Давайте продолжим и создадим базу данных.
Шаг 9 — Щелкните правой кнопкой мыши на области дизайна и выберите «Создать базу данных из модели».
Шаг 10 — Чтобы создать новую базу данных, нажмите «Новое соединение». Откроется следующее диалоговое окно. Нажмите ОК.
Шаг 11 — Нажмите Готово. Это добавит файл * .edmx.sql в проект. Вы можете выполнить сценарии DDL в Visual Studio, открыв файл .sql. Теперь щелкните правой кнопкой мыши и выберите «Выполнить».
Шаг 12 — Зайдите в обозреватель сервера и увидите, что база данных создана с тремя указанными таблицами.
Шаг 13 — Вы также можете видеть, что следующие классы домена также генерируются автоматически.
public partial class Person { public int ID { get; set; } public string FirstMidName { get; set; } public string LastName { get; set; } } public partial class Student : Person { public System.DateTime EnrollmentDate { get; set; } } public partial class Teacher : Person { public System.DateTime HireDate { get; set; } }
Ниже приведен класс Context.
public partial class InheritanceModelContainer : DbContext { public InheritanceModelContainer() : base("name = InheritanceModelContainer") {} protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<Person> People { get; set; } }
Давайте добавим в базу данных некоторых учеников и учителей, а затем извлечем их из базы данных.
class Program { static void Main(string[] args) { using (var context = new InheritanceModelContainer()) { var student = new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(student); var student1 = new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(student1); var techaer = new Teacher { FirstMidName = "Peggy", LastName = "Justice", HireDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(techaer); var techaer1 = new Teacher { FirstMidName = "Yan", LastName = "Li", HireDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(techaer1); context.SaveChanges(); } } }
Студенты и преподаватели добавляются в базу данных. Для извлечения учеников и учителей необходимо использовать метод OfType , который возвращает ученика и учителя, связанных с указанным отделом.
Console.WriteLine("All students in database"); Console.WriteLine(""); foreach (var student in context.People.OfType<Student>()) { string name = student.FirstMidName + " " + student.LastName; Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", student.ID, name, student.EnrollmentDate.ToString()); } Console.WriteLine(""); Console.WriteLine("************************************************************ *****"); Console.WriteLine(""); Console.WriteLine("All teachers in database"); Console.WriteLine(""); foreach (var teacher in context.People.OfType<Teacher>()) { string name = teacher.FirstMidName + " " + teacher.LastName; Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ", teacher.ID, name, teacher.HireDate.ToString()); } Console.WriteLine(""); Console.WriteLine("************************************************************ *****"); Console.ReadKey();
В первом запросе, когда вы используете OfType <Student> (), вы не сможете получить доступ к HireDate, поскольку свойство HireDate является частью сущности учителя, и аналогично свойство EnrollmentDate не будет доступно при использовании OfType <Teacher> ()
Когда приведенный выше код будет выполнен, вы получите следующий вывод:
All students in database ID: 1, Name: Meredith Alonso, Enrollment Date 10/30/2015 12:00:00 AM ID: 2, Name: Arturo Anand, Enrollment Date 10/30/2015 12:00:00 AM ***************************************************************** All teachers in database ID: 3, Name: Peggy Justice, HireDate 10/30/2015 12:00:00 AM ID: 4, Name: Yan Li, HireDate 10/30/2015 12:00:00 AM *****************************************************************
Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.