Разделение таблицы конструктора

В этом пошаговом руководстве показано, как сопоставить несколько типов сущностей с одной таблицей, изменив модель с помощью конструктора Entity Framework (конструктор EF).

Одна из причин, по которой может потребоваться использовать разделение таблиц, заключается в задержке загрузки некоторых свойств при использовании отложенной загрузки для загрузки объектов. Вы можете разделить свойства, которые могут содержать очень большой объем данных в отдельную сущность и загружать их только при необходимости.

На следующем рисунке показаны основные окна, которые используются при работе с конструктором EF.

Конструктор EF

Необходимые условия

Для выполнения данного пошагового руководства необходимо выполнить следующие действия.

Настройка проекта

В этом пошаговом руководстве используется Visual Studio 2012.

  • Откройте Visual Studio 2012.
  • В меню Файл выберите пункт Создать и затем пункт Проект.
  • В левой области щелкните Visual C#, а затем выберите шаблон консольного приложения.
  • Введите TableSplittingSample в качестве имени проекта и нажмите кнопку ОК.

Создание модели на основе учебной базы данных

  • Щелкните правой кнопкой мыши имя проекта в обозревателе решений, наведите указатель мыши на добавление и выберите пункт "Создать элемент".
  • Выберите Данные из меню слева и затем выберите Модель данных сущности ADO.NET в области шаблонов.
  • Введите TableSplittingModel.edmx для имени файла и нажмите кнопку "Добавить".
  • В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее".
  • Нажмите кнопку "Создать подключение". В диалоговом окне "Свойства подключения" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК". Диалоговое окно "Выбор подключения к данным" обновляется с помощью параметра подключения к базе данных.
  • В диалоговом окне "Выбор объектов базы данных" разверните узел Таблиц и отметьте таблицу Person. Это добавит указанную таблицу в модель School .
  • Нажмите кнопку "Готово".

Отображается конструктор сущностей, предоставляющий графический интерфейс для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных ", добавляются в модель.

Сопоставление двух сущностей с одной таблицей

В этом разделе вы разделите сущность Person на две сущности, а затем сопоставите их с одной таблицей.

Замечание

Сущность Person не содержит никаких свойств, которые могут содержать большой объем данных; он просто используется в качестве примера.

  • Щелкните правой кнопкой мыши пустую область конструктора, наведите указатель мыши на Добавление нового и нажмите «Сущность». Откроется диалоговое окно "Создать сущность ".
  • Введите HireInfo для Имени сущности и PersonID для имени Свойства ключа.
  • Нажмите кнопку ОК.
  • Новый тип сущности создается и отображается на поверхности конструктора.
  • Выберите свойство HireDate типа сущности Person и нажмите клавиши CTRL+X .
  • Выберите сущность HireInfo и нажмите клавиши CTRL+V .
  • Создайте связь между Person и HireInfo. Для этого щелкните правой кнопкой мыши пустую область области конструктора, наведите указатель на добавление нового и нажмите кнопку "Связь".
  • Откроется диалоговое окно "Добавить связь ". Имя PersonHireInfo присваивается по умолчанию.
  • Укажите мультиплицитет 1(Один) на обоих концах отношения.
  • Нажмите кнопку ОК.

Для следующего шага необходимо окно Сведений о сопоставлении. Если вы не видите это окно, щелкните правой кнопкой мыши на поверхности разработки и выберите пункт "Сведения о сопоставлении".

  • Выберите тип сущности HireInfo и нажмите <"Добавить таблицу или представление>" в окне Сведения о сопоставлении.

  • Выберите Персону из <раскрывающегося списка в поле "Добавить таблицу или представление>". Список содержит таблицы или представления, с которыми можно сопоставить выбранную сущность. Соответствующие свойства должны быть сопоставлены по умолчанию.

    Свойства сопоставления

  • Выберите связь PersonHireInfo в области конструктора.

  • Щелкните правой кнопкой мыши на ассоциации в области конструктора и выберите Свойства.

  • В окне "Свойства" выберите свойство "Ограничения ссылки " и нажмите кнопку с многоточием.

  • Выберите Личность из раскрывающегося списка Субъект.

  • Нажмите кнопку ОК.

 

Используйте модель

  • Вставьте следующий код в метод Main.
    using (var context = new SchoolEntities())
    {
        Person person = new Person()
        {
            FirstName = "Kimberly",
            LastName = "Morgan",
            Discriminator = "Instructor",
        };

        person.HireInfo = new HireInfo()
        {
            HireDate = DateTime.Now
        };

        // Add the new person to the context.
        context.People.Add(person);

        // Insert a row into the Person table.  
        context.SaveChanges();

        // Execute a query against the Person table.
        // The query returns columns that map to the Person entity.
        var existingPerson = context.People.FirstOrDefault();

        // Execute a query against the Person table.
        // The query returns columns that map to the Instructor entity.
        var hireInfo = existingPerson.HireInfo;

        Console.WriteLine("{0} was hired on {1}",
            existingPerson.LastName, hireInfo.HireDate);
    }
  • Скомпилируйте и запустите приложение.

Следующие инструкции T-SQL были выполнены в базе данных School в результате выполнения этого приложения. 

  • В результате выполнения context.SaveChanges() была выполнена следующая вставка, которая объединяет данные из сущностей Person и HireInfo.

    Вставить комбинированные данные Person и HireInfo

  • Следующая операция SELECT была выполнена в результате вызова context.People.FirstOrDefault() и выбирает только те столбцы, которые сопоставлены с Person

    Выберите 1

  • Следующий параметр SELECT был выполнен в результате доступа к свойству навигации существующегоPerson.Instructor и выбирает только столбцы, сопоставленные с HireInfo.

    Выберите 2