Наследование TPH конструктора
В этом пошаговом руководстве показано, как реализовать наследование таблиц для каждой иерархии (TPH) в концептуальной модели с помощью конструктора Entity Framework (ef Designer). Наследование TPH использует одну таблицу базы данных для хранения данных для всех типов сущностей в иерархии наследования.
В этом пошаговом руководстве мы сопоставим таблицу Person с тремя типами сущностей: Person (базовый тип), Student (производный от person) и Инструктор (производный от Person). Мы создадим концептуальную модель из базы данных (База данных сначала) и измените модель для реализации наследования TPH с помощью конструктора EF.
Можно сопоставить наследование TPH с помощью модели First, но необходимо написать собственный рабочий процесс создания базы данных, который является сложным. Затем вы назначите этот рабочий процесс свойству рабочего процесса создания базы данных в конструкторе EF. Более простой альтернативой является использование кода First.
Другие параметры наследования
Таблица на тип (TPT) — это другой тип наследования, в котором отдельные таблицы в базе данных сопоставляются с сущностями, участвующими в наследовании. Сведения о сопоставлении наследования таблиц на тип с помощью конструктора EF см. в разделе "Наследование TPT конструктора EF".
Табличное наследование типа (TPC) и смешанные модели наследования поддерживаются средой выполнения Entity Framework, но не поддерживаются конструктором EF. Если вы хотите использовать TPC или смешанное наследование, у вас есть два варианта: сначала использовать код или вручную изменить EDMX-файл. Если вы решили работать с EDMX-файлом, окно сведений о сопоставлении будет помещено в "безопасный режим", и вы не сможете использовать конструктор для изменения сопоставлений.
Необходимые компоненты
Для выполнения данного пошагового руководства необходимо выполнить следующие действия.
- Последняя версия Visual Studio.
- Пример базы данных учебного заведения.
Настройка проекта
- Откройте Visual Studio 2012.
- Выбор файла—> создание проекта>
- В левой области щелкните Visual C#, а затем выберите шаблон консоли .
- Введите TPHDBFirstSample в качестве имени.
- Нажмите ОК.
Создание модели
- Щелкните правой кнопкой мыши имя проекта в Обозреватель решений и выберите "Добавить -> Создать элемент".
- Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области шаблонов.
- Введите TPHModel.edmx для имени файла и нажмите кнопку "Добавить".
- В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее".
- Нажмите кнопку "Создать" Подключение. В диалоговом окне "Свойства Подключение ion" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК". Диалоговое окно выбора данных Подключение ion обновляется с параметром подключения к базе данных.
- В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы" выберите таблицу Person .
- Нажмите кнопку Готово.
Отображается конструктор сущностей, предоставляющий область конструктора для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных", добавляются в модель.
Вот как выглядит таблица Person в базе данных.
Реализация наследования таблиц на иерархию
В таблице Person есть столбец "Дискриминатор ", который может иметь одно из двух значений: "Student" и "Instructor". В зависимости от значения , которое таблица Person будет сопоставлена с сущностью Student или сущностью Instructor . В таблице Person также есть два столбца, HireDate и EnrollmentDate, которые должны быть пустыми, так как человек не может быть студентом и инструктором одновременно (по крайней мере, не в этом пошаговом руководстве).
Добавление новых сущностей
- Добавление новой сущности. Для этого щелкните правой кнопкой мыши пустое пространство области конструктора Entity Framework и выберите "Добавить> сущность".
- Введите "Инструктор" для имени сущности и выберите "Человек" в раскрывающемся списке для базового типа.
- Нажмите кнопку ОК.
- Добавьте другую новую сущность. Введите "Учащийся" для имени сущности и выберите "Человек" в раскрывающемся списке для базового типа.
В область конструктора добавлены два новых типа сущностей. Стрелка указывает на новые типы сущностей на тип сущности Person . Это означает, что Person является базовым типом для новых типов сущностей.
- Щелкните правой кнопкой мыши свойство HireDate сущности Person . Выберите "Вырезать " (или использовать клавишу CTRL-X).
- Щелкните правой кнопкой мыши сущность Инструктора и выберите "Вставить " (или используйте клавишу CTRL-V).
- Щелкните правой кнопкой мыши свойство HireDate и выберите "Свойства".
- В окне свойств задайте для свойства null значение false.
- Щелкните правой кнопкой мыши свойство EnrollmentDate сущности Person . Выберите "Вырезать " (или использовать клавишу CTRL-X).
- Щелкните правой кнопкой мыши сущность Student и выберите "Вставить" (или используйте клавишу CTRL-V).
- Выберите свойство EnrollmentDate и задайте для свойства Nullable значение false.
- Выберите тип сущности Person . В окне свойств задайте для свойства Abstract значение true.
- Удалите свойство дискриминационных пользователей. Причина удаления описана в следующем разделе.
Сопоставление сущностей
Щелкните правой кнопкой мыши инструктор и выберите "Сопоставление таблиц". Сущность "Инструктор" выбрана в окне сведений о сопоставлении.
Нажмите кнопку <"Добавить таблицу или представление> " в окне сведений о сопоставлении. Поле <"Добавить таблицу" или "Вид> " становится раскрывающимся списком таблиц или представлений, с которыми можно сопоставить выбранную сущность.
Выберите человека из раскрывающегося списка.
Окно сведений о сопоставлении обновляется с сопоставлениями столбцов по умолчанию и параметром для добавления условия.
Нажмите кнопку <"Добавить условие>". Поле <"Добавить условие> " становится раскрывающимся списком столбцов, для которых можно задать условия.
Выберите дискриминатор из раскрывающегося списка.
В столбце "Оператор" окна сведений о сопоставлении выберите = в раскрывающемся списке.
В столбце Value/Property введите Instructor. Конечный результат должен выглядеть следующим образом:
Повторите эти действия для типа сущности Student , но сделайте условие равным значению Student .
Причина, по которой мы хотели удалить свойство Дискриминатора , заключается в том, что вы не можете сопоставить столбец таблицы более одного раза. Этот столбец будет использоваться для условного сопоставления, поэтому его нельзя использовать для сопоставления свойств. Единственный способ, который можно использовать для обоих вариантов, если условие использует сравнение is NULL или не равно NULL.
Теперь наследование типа «одна таблица на иерархию» успешно реализовано.
Использование модели
Откройте файл Program.cs, в котором определен метод Main. Вставьте следующий код в функцию Main . Код выполняет три запроса. Первый запрос возвращает все объекты Person . Второй запрос использует метод OfType для возврата объектов Instructor . Третий запрос использует метод OfType для возврата объектов Student .
using (var context = new SchoolEntities())
{
Console.WriteLine("All people:");
foreach (var person in context.People)
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
Console.WriteLine("Instructors only: ");
foreach (var person in context.People.OfType<Instructor>())
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
Console.WriteLine("Students only: ");
foreach (var person in context.People.OfType<Student>())
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
}