Поделиться через


Наследование 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 и выберите "Удалить из модели"
  • Теперь наследование типа «одна таблица на тип» реализовано.

Table Per Type

Использование модели

Откройте файл 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);
            }
        }
    }