Наследование TPT конструктора

В этом пошаговом руководстве показано, как реализовать наследование таблицы на тип (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 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);
            }
        }
    }