Entity Framework - наследование
Наследование позволяет создавать сложные модели, которые лучше отражают образ мышления разработчиков, а также сокращает объем работы, необходимой для взаимодействия с этими моделями. Наследование, используемое с сущностями, служит той же цели, что и наследование, используемое с классами, поэтому разработчики уже знают основы работы этой функции.
Давайте посмотрим на следующий пример и создадим новый проект консольного приложения.
Step 1 - Добавьте модель данных сущности ADO.NET, щелкнув правой кнопкой мыши имя проекта и выбрав Добавить → Новый элемент…
Step 2 - Добавьте одну сущность и назовите ее "Человек", выполнив все шаги, описанные в главе "Подход" сначала модель ".
Step 3 - Добавьте некоторые скалярные свойства, как показано на следующем рисунке.
Step 4 - Мы добавим еще две сущности Student и Teacher, который унаследует свойства из таблицы людей.
Step 5 - Теперь добавьте объект «Студент» и выберите «Человек» в поле со списком «Базовый тип», как показано на следующем рисунке.
Step 6 - Аналогичным образом добавьте объект «Учитель».
Step 7 - Теперь добавьте скалярное свойство EnrollmentDate в сущность ученика и свойство HireDate в сущность Teacher.
Step 8 - Давайте продолжим и создадим базу данных.
Step 9 - Щелкните правой кнопкой мыши область конструктора и выберите «Создать базу данных из модели…»
Step 10- Чтобы создать новую базу данных, нажмите «Новое соединение»… Откроется следующий диалог. Щелкните ОК.
Step 11- Щелкните Готово. Это добавит в проект файл * .edmx.sql. Вы можете выполнять сценарии DDL в Visual Studio, открыв файл .sql. Теперь щелкните правой кнопкой мыши и выберите «Выполнить».
Step 12 - Перейдите в проводник сервера, вы увидите, что база данных создана с тремя указанными таблицами.
Step 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();
}
}
}
Студенты и преподаватели добавляются в базу данных. NЧтобы получить учеников и учителя,OfType необходимо использовать метод, который вернет Student и Teacher, относящиеся к указанному отделу.
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 является частью Teacher Entity, и аналогично свойство 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
*****************************************************************
Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.