Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как реализовать наследование таблицы на тип (TPT) в модели с помощью конструктора Entity Framework (EF Designer). Наследование опирающееся на таблицы использует отдельную таблицу в базе данных для хранения данных неунаследованных и ключевых свойств для каждого типа в иерархии наследования.
В этом пошаговом руководстве мы сопоставим курс (базовый тип), OnlineCourse (производный от Course) и OnsiteCourse (производных от Course) сущностей с таблицами с одинаковыми именами. Мы создадим модель из базы данных, а затем изменим модель для реализации наследования TPT.
Вы также можете начать с модели First, а затем создать базу данных из модели. Конструктор EF использует стратегию TPT по умолчанию, поэтому любое наследование в модели будет сопоставлено с отдельными таблицами.
Другие параметры наследования
Таблица на иерархию (TPH) — это другой тип наследования, в котором одна таблица базы данных используется для хранения данных для всех типов сущностей в иерархии наследования. Сведения о том, как выполнить сопоставление наследования по принципу таблица-на-иерархию (Table-per-Hierarchy) с помощью конструктора сущностей, см. в разделе "Наследование TPH" в конструкторе сущностей.
Обратите внимание, что наследование по модели TPC (Table-per-Concrete Type) и смешанные модели наследования поддерживаются средой выполнения Entity Framework, но не поддерживаются в конструкторе EF. Если вы хотите использовать TPC или смешанное наследование, у вас есть два варианта: использовать подход Code First или вручную изменить EDMX-файл. Если вы решили работать с EDMX-файлом, окно сведений о сопоставлении будет помещено в "безопасный режим", и вы не сможете использовать конструктор для изменения сопоставлений.
Необходимые условия
Для выполнения данного пошагового руководства необходимо выполнить следующие действия.
- Последняя версия Visual Studio.
- Пример базы данных учебного заведения.
Настройка проекта
- Откройте Visual Studio 2012.
- Выберите Файл -> Новый -> Проект
- В левой области щелкните Visual C#, а затем выберите шаблон консоли .
- Введите TPTDBFirstSample в качестве имени.
- Нажмите ОК.
Создание модели
- Щелкните проект правой кнопкой мыши в обозревателе решений и выберите "Добавить -> Новый элемент".
- Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области шаблонов.
- Введите TPTModel.edmx для имени файла и нажмите кнопку "Добавить".
- В диалоговом окне "Выбор содержимого модели" выберите** Создать из базы данных**, а затем нажмите кнопку "Далее".
- Нажмите кнопку "Создать подключение". В диалоговом окне "Свойства подключения" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК". Диалоговое окно "Выбор подключения к данным" обновляется с помощью параметра подключения к базе данных.
- В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы" выберите таблицы "Отдел", " Курс", "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);
}
}
}