Пошаговое руководство по сопоставлению сущностей с несколькими таблицами (средства модели EDM)
В этом подразделе показано, как сопоставить тип сущности с двумя таблицами путем изменения концептуальной модели. Сущность можно сопоставить с несколькими таблицами, если в таблицах имеется общий ключ. Основные понятия, которые применяются для сопоставления типа сущности с двумя таблицами, легко распространить на сопоставление типа сущности более чем с двумя таблицами.
В этом пошаговом руководстве тип сущности будет сопоставлен с двумя таблицами путем изменения концептуальной модели, используемой в приложении CourseManager (дополнительные сведения см. в подразделе «Предварительные условия» далее в этом разделе). Будет создан новый тип сущности (Instructor, производный от типа сущности Person ) и сопоставлен с таблицами Person и OfficeAssignment. Приведенные ниже шаги описывают процесс в общем (более подробные сведения приведены в процедурах ниже в этом документе).
Создайте новый тип сущности Instructor.
Установите базовый тип для Instructor в значение Person.
Примечание Не обязательно создавать иерархию наследования для сопоставления типа сущности с несколькими таблицами.В этом примере используется иерархия наследования, чтобы сделать его более реалистичным (в школе кабинет закрепляется только за инструктором).Предусмотрена возможность сопоставить тип сущности Person как с таблицей Person, так и с таблицей OfficeAssignment, не создавая тип сущности Instructor. Переместите свойство HireDate из Person в Instructor.
Переместите свойства Location и Timestamp из OfficeAssignment в Instructor.
Сопоставьте сущность Instructor с таблицей Person, учитывая условие HireDate Is Not Null. Сопоставьте столбец HireDate со свойством HireDate.
Сопоставьте сущность Instructor с таблицей OfficeAssignment без условия. Сопоставьте столбец InstructorID со свойством PersonID, а столбец Location — со свойством Location.
Удаление типа сущности OfficeAssignment.
Предварительные требования
Чтобы завершить работу с этим пошаговым руководством, необходимо вначале построить приложение CourseManager. Дополнительные сведения см. в разделе Краткое руководство по платформе Entity Framework. Концептуальная модель, используемая в приложении CourseManager, будет изменена путем добавления нового типа сущности и его сопоставления с двумя таблицами. Затем будут расширены функциональные возможности приложения, чтобы отображалось закрепление кабинетов за инструкторами.
Примечание |
---|
Приложение CourseManager используется в качестве отправной точки во многих разделах пошагового руководства в данной документации, поэтому рекомендуется использовать для данного пошагового руководства копию приложения CourseManager, а не вносить изменения в первоначальный код CourseManager. |
В этом пошаговом руководстве предполагается, что читатель владеет основами среды Visual Studio, платформы .NET Framework и программирования на языке Visual C# или Visual Basic.
Сопоставление сущности с двумя таблицами
В этой процедуре будут изменены CSDL и содержимое сопоставления файла School.edmx путем создания нового типа сущности (Instructor) и его сопоставления с двумя таблицами (Person и OfficeAssignment).
Сопоставление сущности с двумя таблицами
Откройте решение CourseManager в среде Visual Studio.
В обозревателе решений дважды щелкните файл School.edmx.
Файл School.edmx открывается в конструкторе моделей EDM (конструктор сущностей).
Щелкните правой кнопкой мыши пустой участок области конструктора сущностей, укажите Добавить и выберите пункт Сущность.
Появится диалоговое окно Создание сущности.
Введите значение Instructor в поле Имя сущности и выберите пункт Person в раскрывающемся списке Базовый тип.
Нажмите кнопку ОК.
Новый тип сущности будет создан и отобразится в области конструктора.
Щелкните правой кнопкой мыши свойство HireDate (в разделе Скалярные свойства) типа сущности Person и выберите пункт Вырезать.
Щелкните правой кнопкой мыши свойство Скалярные свойства типа сущности Instructor и выберите пункт Вставить.
Щелкните правой кнопкой мыши свойство HireDate и выберите пункт Свойства.
Появится окно Свойства.
В окне Свойства установите свойство Допускает значения Null в значение false.
Щелкните правой кнопкой мыши свойство Location типа сущности OfficeAssignment и выберите пункт Вырезать.
Щелкните правой кнопкой мыши свойство Скалярные свойства типа сущности Instructor и выберите пункт Вставить.
Щелкните правой кнопкой мыши свойство Location и выберите пункт Свойства.
В окне Свойства установите свойство Допускает значения Null в значение false.
Повторите шаги с 10 по 13 для свойства Timestamp типа OfficeAssignment.
Примечание Для следующего шага требуется окно Сведения о сопоставлении.Если это окно не откроется, щелкните правой кнопкой мыши область конструктора, а затем выберите пункт Сведения о сопоставлении. Выберите тип сущности Instructor и щелкните <Добавить таблицу или представление> в окне Сведения о сопоставлении.
Поле <Добавить таблицу или представление> становится раскрывающимся списком таблиц и представлений, с которым может быть сопоставлена выбранная сущность.
Выберите пункт Person из раскрывающегося списка.
Окно Сведения о сопоставлении обновляется с учетом сопоставления столбцов по умолчанию и параметра для добавления условия.
Нажмите кнопку <Добавить условие>.
Поле <Добавить условие> становится раскрывающимся списком столбцов, для которых могут быть заданы условия.
Выберите пункт HireDate из раскрывающегося списка.
В столбце Оператор окна Сведения о сопоставлении выберите Является из раскрывающегося списка.
В столбце Свойство/Значение окна Сведения о сопоставлении выберите Не Null.
Нажмите кнопку <Добавить таблицу или представление> и выберите OfficeAssignment из раскрывающегося списка.
Окно Сведения о сопоставлении обновляется с учетом сопоставлений столбцов по умолчанию.
Щелкните поле Свойство/Значение, которое соответствует столбцу InstructorID, и выберите PersonID из раскрывающегося списка.
Щелкните правой кнопкой мыши тип сущности OfficeAssignment и выберите пункт Удалить.
Теперь тип сущности Instructor становится сопоставленным с таблицами Person и OfficeAssignment.
Создание пользовательского интерфейса
Затем необходимо добавить кнопку к форме CourseViewer, которая загружает и отображает форму CourseAssignmentForm. После этого к форме добавляется элемент управления DataGridView для отображения мест расположения кабинетов Instructor. Наконец, к форме CourseAssignmentForm будет добавлена кнопка для сохранения обновлений в базе данных.
Создание пользовательского интерфейса
Щелкните правой кнопкой мыши имя проекта CourseManager в окне Обозреватель решений, укажите пункт Добавить и выберите пункт Новый элемент.
Появится диалоговое окно Добавление нового элемента.
Выберите Форма Windows Forms, присвойте ей имя OfficeAssignment.vb или OfficeAssignment.cs, а затем нажмите кнопку Добавить.
Новая форма будет добавлена к проекту и открыта в конструкторе форм. Форме назначается имя OfficeAssignment и текст OfficeAssignment.
Перетащите в форму элемент управления DataGridView и присвойте ему имя officeGridView.
Щелкните смарт-тег DataGridView и снимите флажки Включить добавления и Включить удаления.
Перетащите в форму элемент управления Button и присвойте его свойству имени значение saveChanges, а свойству текста — значение Update.
В окне Обозреватель решений дважды щелкните форму CourseViewer.cs или CourseViewer.vb.
Форма CourseViewer откроется в конструкторе.
Перетащите элемент управления Button из области элементов в форму CourseViewer.
В окне Свойства установите имя кнопки viewOffices, а затем установите текст кнопки View Offices.
Дважды нажмите viewOffices Button.
Откроется файл с фоновым кодом для формы CourseViewer.
Добавьте следующий код в обработчик события viewOffices_click:
Dim officeForm As New OfficeAssignment() officeForm.Visible = True
OfficeAssignment officeForm = new OfficeAssignment(); officeForm.Visible = true;
Теперь создание пользовательского интерфейса для этой формы завершено.
Выполнение запроса к концептуальной модели
Это приложение отображает данные, привязывая элемент управления DataGridView к запросу. Сведения, отображаемые в элементе управления DataGridView, можно отредактировать и сохранить изменения в базе данных. Дополнительные сведения о привязке объектов к элементам управления см. в разделе Binding Objects to Controls (Entity Framework).
Запрос к концептуальной модели
Открыв форму OfficeAssignment в конструкторе форм, дважды щелкните ее текст.
Откроется файл с фоновым кодом для формы OfficeAssignment.
Добавьте следующие инструкции using (C#) или Imports (Visual Basic), чтобы сослаться на модель, созданную из базы данных School, и пространство имен сущностей.
Imports System.Data.Objects Imports System.Data.Objects.DataClasses
using System.Data.Objects; using System.Data.Objects.DataClasses;
Добавьте свойство, которое представляет контекст данных, к классу OfficeAssignment:
' Create an ObjectContext instance based on SchoolEntity. Private schoolContext As SchoolEntities
// Create an ObjectContext instance based on SchoolEntity. private SchoolEntities schoolContext;
В обработчике события OfficeAssignment_Load добавьте код для инициализации контекста объекта и выполните привязку элемента управления DataGridView к запросу, который возвращает сведения Instructor.
' Initialize the ObjectContext. schoolContext = New SchoolEntities() ' Get Persons of type Instructor. Dim instructorQuery As ObjectQuery(Of Instructor) = _ schoolContext.People.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 officeGridView.Columns("StudentGrades").Visible = False officeGridView.Columns("Courses").Visible = False
schoolContext = new SchoolEntities(); // Get Persons of type Instructor. ObjectQuery<Instructor> instructorQuery = schoolContext .People.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; officeGridView.Columns["StudentGrades"].Visible = false; officeGridView.Columns["Courses"].Visible = false;
Возвратитесь к конструктору формы OfficeAssignment и дважды щелкните элемент управления saveChanges Button.
Обработчик события saveChanges_Click создается в файле с фоновым кодом.
Добавьте код к обработчику события, чтобы сохранить любые изменения, внесенные в элемент управления DataGridView для базы данных.
' Save object changes to the database, ' display a message, and refresh the form. schoolContext.SaveChanges() MessageBox.Show("Change(s) saved to the database.") Me.Refresh()
// Save object changes to the database, // display a message, and refresh the form. schoolContext.SaveChanges(); MessageBox.Show("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.People.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
officeGridView.Columns("StudentGrades").Visible = False
officeGridView.Columns("Courses").Visible = False
End Sub
Private Sub saveChanges_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles saveChanges.Click
' Save object changes to the database,
' display a message, and refresh the form.
schoolContext.SaveChanges()
MessageBox.Show("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
.People.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;
officeGridView.Columns["StudentGrades"].Visible = false;
officeGridView.Columns["Courses"].Visible = false;
}
private void saveChanges_Click(object sender, EventArgs e)
{
// Save object changes to the database,
// display a message, and refresh the form.
schoolContext.SaveChanges();
MessageBox.Show("Change(s) saved to the database.");
this.Refresh();
}
}
}
Следующие шаги
Успешно выполнено сопоставление сущности с несколькими таблицами. Дополнительные сведения о создании модели с сущностями, сопоставленными с несколькими таблицами, см. в разделе How to: Define a Model with a Single Entity Mapped to Two Tables. Дополнительные сведения о построении приложений, использующих платформу Entity Framework, см. в разделе ADO.NET Entity Framework.
См. также
Другие ресурсы
Сценарии средств работы с моделью EDM
Задачи средств модели EDM