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


Пошаговое руководство: сопоставление сущности с несколькими таблицами

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

В этом пошаговом руководстве тип сущности будет сопоставлен с двумя таблицами путем изменения модели EDM, используемой в приложении CourseManager (дополнительные сведения см. в подразделе «Предварительные условия» далее в этом разделе). Будет создан новый тип сущности (Instructor, производный от типа сущности Person ) и сопоставлен с таблицами Person и OfficeAssignment. Приведенные ниже шаги описывают процесс в общем (более подробные сведения приведены в процедурах ниже в этом документе).

  1. Создайте новый тип сущности Instructor.

  2. Установите базовый тип для Instructor в значение Person.

    NoteПримечание.

    Не обязательно создавать иерархию наследования для сопоставления типа сущности с несколькими таблицами. В этом примере используется иерархия наследования, чтобы сделать его более реалистичным (в школе кабинет закрепляется только за инструктором). Предусмотрена возможность сопоставить тип сущности Person как с таблицей Person, так и с таблицей OfficeAssignment, не создавая тип сущности Instructor.

  3. Переместите свойство HireDate из Person в Instructor.

  4. Переместите свойство Location из OfficeAssignment в Instructor.

  5. Сопоставьте сущность Instructor с таблицей Person, учитывая условие HireDate Is Not Null. Сопоставьте столбец HireDate со свойством HireDate.

  6. Сопоставьте сущность Instructor с таблицей OfficeAssignment без условия. Сопоставьте столбец InstructorID со свойством PersonID, а столбец Location — со свойством Location.

  7. Удаление типа сущности OfficeAssignment.

Предварительные требования

Чтобы завершить работу с этим пошаговым руководством, необходимо вначале построить приложение CourseManager. Дополнительные сведения см. в разделе Краткое руководство по платформе Entity Framework. Модель EDM, используемая в приложении CourseManager, будет изменена путем добавления нового типа сущности и его сопоставления с двумя таблицами. Затем будут расширены функциональные возможности приложения, чтобы отображалось закрепление кабинетов за инструкторами.

NoteПримечание.

Приложение CourseManager используется в качестве отправной точки во многих разделах пошагового руководства в данной документации, поэтому рекомендуется использовать для данного пошагового руководства копию приложения CourseManager, а не вносить изменения в первоначальный код CourseManager.

В этом пошаговом руководстве предполагается, что читатель владеет основами среды Visual Studio, платформы .NET Framework и программирования на языке Visual C# или Visual Basic.

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

В этой процедуре будет изменена концептуальная часть модели SchoolModel EDM путем создания нового типа сущности (Instructor) и его сопоставления с двумя таблицами (Person и OfficeAssignment).

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

  1. Откройте решение CourseManager в среде Visual Studio.

  2. В обозревателе решений дважды щелкните файл School.edmx.

    Файл School.edmx открывается в конструкторе моделей EDM (конструктор сущностей).

  3. Щелкните правой кнопкой мыши пустой участок области конструктора сущностей, укажите Добавить и выберите пункт Сущность.

    Появится диалоговое окно Создание сущности.

  4. Введите значение Instructor в поле Имя сущности и выберите пункт Person в раскрывающемся списке Базовый тип.

  5. Нажмите ОК.

    Новый тип сущности будет создан и отобразится в области конструктора.

  6. Щелкните правой кнопкой мыши свойство HireDate (в разделе Скалярные свойства) типа сущности Person и выберите пункт Вырезать.

  7. Щелкните правой кнопкой мыши свойство Скалярные свойства типа сущности Instructor и выберите пункт Вставить.

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

    Появится окно Свойства.

  9. В окне Свойства установите свойство Допускает значения NULL в значение false.

  10. Щелкните правой кнопкой мыши свойство Location типа сущности OfficeAssignment и выберите пункт Вырезать.

  11. Щелкните правой кнопкой мыши свойство Скалярные свойства типа сущности Instructor и выберите пункт Вставить.

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

  13. В окне Свойства установите свойство Допускает значения NULL в значение false.

  14. Повторите шаги с 10 по 13 для свойства Timestamp типа OfficeAssignment.

    NoteПримечание.

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

  15. Выберите тип сущности Instructor и щелкните <Добавить таблицу или представление> в окне Сведения о сопоставлении.

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

  16. Выберите пункт Person из раскрывающегося списка.

    Окно Сведения о сопоставлении обновляется с учетом сопоставления столбцов по умолчанию и параметра для добавления условия.

  17. Нажмите кнопку <Добавить условие>.

    Поле <Добавить условие> становится раскрывающимся списком столбцов, для которых могут быть заданы условия.

  18. Выберите пункт HireDate из раскрывающегося списка.

  19. В столбце Оператор окна Сведения о сопоставлении выберите Является из раскрывающегося списка.

  20. В столбце Свойство/Значение окна Сведения о сопоставлении выберите Не NULL.

  21. Нажмите кнопку <Добавить таблицу или представление> и выберите OfficeAssignment из раскрывающегося списка.

    Окно Сведения о сопоставлении обновляется с учетом сопоставлений столбцов по умолчанию.

  22. Щелкните поле Свойство/Значение, которое соответствует столбцу InstructorID, и выберите PersonID из раскрывающегося списка.

  23. Щелкните правой кнопкой мыши тип сущности OfficeAssignment и выберите пункт Удалить.

Теперь тип сущности Instructor становится сопоставленным с таблицами Person и OfficeAssignment.

Создание пользовательского интерфейса

Затем необходимо добавить кнопку к форме CourseViewer, которая загружает и отображает форму CourseAssignmentForm. После этого к форме добавляется элемент управления DataGridView для отображения мест расположения кабинетов Instructor. Наконец, к форме CourseAssignmentForm будет добавлена кнопка для сохранения обновлений в базе данных.

Создание пользовательского интерфейса

  1. Щелкните правой кнопкой мыши имя проекта CourseManager в окне Обозреватель решений, укажите пункт Добавить и выберите пункт Новый элемент.

    Появится диалоговое окно Добавление нового элемента.

  2. Выберите Форма Windows Forms, назначьте форме имя OfficeAssignment.vb или OfficeAssignment.cs и нажмите кнопку Добавить.

    Новая форма будет добавлена к проекту и открыта в конструкторе форм. Форме назначается имя OfficeAssignment и текст OfficeAssignment.

  3. Перетащите в форму элемент управления DataGridView и присвойте ему имя officeGridView.

  4. Щелкните смарт-тег DataGridView и снимите флажки Включить добавления и Включить удаления.

  5. Перетащите в форму элемент управления Button и присвойте его свойству имени значение saveChanges, а свойству текста — значение Update.

  6. В окне Обозреватель решений дважды щелкните форму CourseViewer.cs или CourseViewer.vb.

    Форма CourseViewer откроется в конструкторе.

  7. Перетащите элемент управления Button из области элементов в форму CourseViewer.

  8. В окне Свойства установите имя кнопки viewOffices, а затем установите текст кнопки View Offices.

  9. Дважды нажмите viewOfficesButton.

    Откроется файл с фоновым кодом для CourseViewer.

  10. Добавьте следующий код в обработчик события viewOffices_click:

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

Теперь создание пользовательского интерфейса для этой формы завершено.

Запрос к модели EDM

Это приложение отображает данные путем привязки элемента управления DataGridView к модели SchoolModel EDM. Сведения, отображаемые в элементе управления DataGridView, можно отредактировать и сохранить изменения в базе данных. Дополнительные сведения о привязке объектов к элементам управления см. в разделе Привязка объектов к элементам управления (платформа Entity Framework).

Запрос к модели EDM

  1. Открыв форму OfficeAssignment в конструкторе форм, дважды щелкните текст формы.

    Открывается файл с фоновым кодом для OfficeAssignment.

  2. Добавьте следующие инструкции using (C#) или Imports (Visual Basic), чтобы сослаться на модель, созданную из базы данных School, и пространство имен сущностей.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Добавьте свойство, которое представляет контекст данных, к классу OfficeAssignment:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. В обработчике события OfficeAssignment_Load добавьте код для инициализации контекста объекта и выполните привязку элемента управления DataGridView к запросу, который возвращает сведения Instructor.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.Person.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .Person.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    
  5. Возвратитесь к конструктору формы OfficeAssignment и дважды щелкните элемент управления saveChangesButton.

    Обработчик события saveChanges_Click создается в файле с фоновым кодом.

  6. Добавьте код к обработчику события, чтобы сохранить любые изменения, внесенные в элемент управления DataGridView для базы данных.

    Dim numChanges As Integer
    
    ' Save object changes to the database, display a message,
    ' and refresh the form.
    numChanges = schoolContext.SaveChanges()
    MessageBox.Show(numChanges.ToString() + _
                    " change(s) saved to the database.")
    Me.Refresh()
    
    int numChanges;
    // Save object changes to the database, display a message,
    // and refresh the form.
    numChanges = schoolContext.SaveChanges();
    MessageBox.Show(numChanges.ToString() +
        " change(s) saved to the database.");
    this.Refresh();
    

Создание приложения завершено. Нажмите клавиши Ctrl + F5, чтобы запустить приложение. Нажмите кнопку View Offices, чтобы загрузить форму OfficeAssignments. Отображаются имена инструкторов и местонахождение кабинетов. Отображаемые сведения могут быть изменены и сохранены в базе данных нажатием кнопки Update.

Листинг кода

В этом разделе содержится окончательная версия файла с фоновым кодом для формы OfficeAssignmentForm.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub OfficeAssignment_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.Person.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveChanges.Click
        Dim numChanges As Integer

        ' Save object changes to the database, display a message,
        ' and refresh the form.
        numChanges = schoolContext.SaveChanges()
        MessageBox.Show(numChanges.ToString() + _
                        " change(s) saved to the database.")
        Me.Refresh()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .Person.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            int numChanges;
            // Save object changes to the database, display a message,
            // and refresh the form.
            numChanges = schoolContext.SaveChanges();
            MessageBox.Show(numChanges.ToString() +
                " change(s) saved to the database.");
            this.Refresh();
        }
    }
}

Следующие шаги

Успешно выполнено сопоставление сущности с несколькими таблицами. Дополнительные сведения о создании модели с сущностями, сопоставленными с несколькими таблицами, см. в разделе Как определить модель с одной сущностью, сопоставленной с двумя таблицами. Дополнительные сведения о построении приложений, использующих платформу Entity Framework, см. в разделе Руководство по программированию (платформа Entity Framework).

См. также

Другие ресурсы

Сценарии конструктора моделей EDM ADO.NET
Задачи средств модели EDM