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

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

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

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

EF Designer

Необходимые компоненты

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

  • Последняя версия Visual Studio.
  • Пример базы данных учебного заведения.

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

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

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

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

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

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

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

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

Примечание.

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

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

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

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

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

    Mapping Properties

  • Выберите связь 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 в результате выполнения этого приложения. 

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

    Insert Combining Person and HireInfo Data

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

    Select 1

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

    Select 2