Наследование TPT конструктора
В этом пошаговом руководстве показано, как реализовать наследование таблицы на тип (TPT) в модели с помощью конструктора Entity Framework (EF Designer). В наследовании типа «одна таблица на тип» используется отдельная таблица в базе данных для сопровождения данных, относящихся к ненаследуемым свойствам и ключевым свойствам для каждого типа в иерархии наследования.
В этом пошаговом руководстве мы сопоставим курс (базовый тип), OnlineCourse (производный от Course) и OnsiteCourse (производных от Course) сущностей с таблицами с одинаковыми именами. Мы создадим модель из базы данных, а затем изменим модель для реализации наследования TPT.
Вы также можете начать с модели First, а затем создать базу данных из модели. Конструктор EF использует стратегию TPT по умолчанию, поэтому любое наследование в модели будет сопоставлено с отдельными таблицами.
Другие параметры наследования
Таблица на иерархию (TPH) — это другой тип наследования, в котором одна таблица базы данных используется для хранения данных для всех типов сущностей в иерархии наследования. Сведения о сопоставлении наследования таблиц на иерархию с конструктором сущностей см. в разделе "Наследование TPH" в конструкторе сущностей.
Обратите внимание, что модели наследования табличного типа (TPC) и смешанных наследования поддерживаются средой выполнения Entity Framework, но не поддерживаются конструктором EF. Если вы хотите использовать TPC или смешанное наследование, у вас есть два варианта: сначала использовать код или вручную изменить EDMX-файл. Если вы решили работать с EDMX-файлом, окно сведений о сопоставлении будет помещено в "безопасный режим", и вы не сможете использовать конструктор для изменения сопоставлений.
Необходимые компоненты
Для выполнения данного пошагового руководства необходимо выполнить следующие действия.
- Последняя версия Visual Studio.
- Пример базы данных учебного заведения.
Настройка проекта
- Откройте Visual Studio 2012.
- Выбор файла—> создание проекта>
- В левой области щелкните Visual C#, а затем выберите шаблон консоли .
- Введите TPTDBFirstSample в качестве имени.
- Нажмите ОК.
Создание модели
- Щелкните проект правой кнопкой мыши в Обозреватель решений и выберите "Добавить -> Новый элемент".
- Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области шаблонов.
- Введите TPTModel.edmx для имени файла и нажмите кнопку "Добавить".
- В диалоговом окне "Выбор содержимого модели" выберите** Создать из базы данных**, а затем нажмите кнопку "Далее".
- Нажмите кнопку "Создать" Подключение. В диалоговом окне "Свойства Подключение ion" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК". Диалоговое окно выбора данных Подключение ion обновляется с параметром подключения к базе данных.
- В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы" выберите таблицы "Отдел", "Курс", "OnlineCourse" и "OnsiteCourse ".
- Нажмите кнопку Готово.
Отображается конструктор сущностей, предоставляющий область конструктора для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных", добавляются в модель.
Реализация наследования таблиц на тип
- В области конструктора щелкните правой кнопкой мыши тип сущности OnlineCourse и выберите "Свойства".
- В окне "Свойства" задайте для свойства Base Type значение Course.
- Щелкните правой кнопкой мыши тип сущности OnsiteCourse и выберите "Свойства".
- В окне "Свойства" задайте для свойства Base Type значение Course.
- Щелкните правой кнопкой мыши связь (линия) между типами сущностей OnlineCourse и Course . Выберите "Удалить из модели".
- Щелкните правой кнопкой мыши связь между типами сущностей OnsiteCourse и Course . Выберите "Удалить из модели".
Теперь мы удалим свойство CourseID из OnlineCourse и OnsiteCourse, так как эти классы наследуют CourseID от базового типа Course.
- Щелкните правой кнопкой мыши свойство CourseID типа сущности OnlineCourse и выберите "Удалить из модели".
- Щелкните правой кнопкой мыши свойство CourseID типа сущности OnsiteCourse и выберите "Удалить из модели"
- Теперь наследование типа «одна таблица на тип» реализовано.
Использование модели
Откройте файл Program.cs, в котором определен метод Main. Вставьте следующий код в функцию Main . Код выполняет три запроса. Первый запрос возвращает все курсы , связанные с указанным отделом. Второй запрос использует метод OfType для возврата OnlineCourses , связанных с указанным отделом. Третий запрос возвращает OnsiteCourses.
using (var context = new SchoolEntities())
{
foreach (var department in context.Departments)
{
Console.WriteLine("The {0} department has the following courses:",
department.Name);
Console.WriteLine(" All courses");
foreach (var course in department.Courses )
{
Console.WriteLine(" {0}", course.Title);
}
foreach (var course in department.Courses.
OfType<OnlineCourse>())
{
Console.WriteLine(" Online - {0}", course.Title);
}
foreach (var course in department.Courses.
OfType<OnsiteCourse>())
{
Console.WriteLine(" Onsite - {0}", course.Title);
}
}
}