Пошаговое руководство: получение типов сущностей с помощью хранимой процедуры
В этом разделе показаны способы использования хранимой процедуры для получения коллекции типов сущностей. В этом пошаговом руководстве конструктор моделей EDM ADO.NET (конструктор сущностей) используется для импорта хранимой процедуры и создания хранимой процедуры Function Import, которая возвращает коллекцию типов сущностей.
Включение хранимой процедуры в модель EDM позволяет вызывать хранимую процедуру из кода приложения. Хранимая процедура, добавленная в концептуальную модель, называется Function Import. Хранимая процедура Function Import может возвращать коллекции простых типов или типов сущностей либо не возвращать значение.
Примечание. |
---|
Чтобы хранимая процедура Function Import возвратила тип сущности EntityType, столбцы, возвращенные соответствующей хранимой процедурой, должны точно соответствовать свойствам возвращенного типа сущности EntityType. |
Мастер моделей EDM при формировании модели EDM из базы данных создает в модели хранения элементы для каждой хранимой процедуры в базе данных. Соответствующие элементы добавляются в концептуальную модель при создании Function Import. Дополнительные сведения о создании Function Import см. в разделе Как импортировать хранимую процедуру.
Предварительные требования
Для работы с этим пошаговым руководством необходимо построить приложение CourseManager. Дополнительные сведения и инструкции см. в разделе Краткое руководство по платформе Entity Framework. После построения приложения необходимо изменить модель EDM путем создания хранимой процедуры Function Import на основе хранимой процедуры GetStudentGrades.
Примечание. |
---|
Приложение CourseManager используется в качестве отправной точки во многих разделах пошагового руководства в данной документации, поэтому рекомендуется использовать для данного пошагового руководства копию приложения CourseManager, а не вносить изменения в первоначальный код CourseManager. |
В этом пошаговом руководстве предполагается, что читатель обладает основными навыками работы со средой Visual Studio и платформой .NET Framework, а также навыками программирования на языке Visual C# или Visual Basic.
Создание функции импорта
В этом процессе будет создана хранимая процедура Function Import на основе хранимой процедуры GetStudentGrades, которая включается в модель хранения CourseManager EDM.
Создание функции импорта
Откройте решение CourseManager в среде Visual Studio.
В обозревателе решений дважды щелкните файл School.edmx.
Файл School.edmx открывается в конструкторе моделей EDM ADO.NET (конструктор сущностей), а также открывается окно Обозреватель моделей.
Разверните узел EntityContainer: SchoolEntities в окне Обозреватель моделей.
В древовидном представлении являются видимыми папки Наборы сущностей, Наборы ассоциаций и Импортируемые функции.
Щелкните правой кнопкой мыши элемент Импортируемые функции и выберите Создать импорт функции.
Откроется диалоговое окно New Function Import.
Выберите GetStudentGrades из раскрывающегося списка Имя хранимой процедуры.
Введите GetStudentGrades в текстовом поле Имя функции импорта.
Выберите CourseGrade из раскрывающегося списка Тип возвращаемых данных.
Примечание. Можно установить возвращаемый тип CourseGrade, так как столбцы, возвращаемые хранимой процедурой GetStudentGrades (EnrollementID и Grade), точно соответствуют скалярным свойствам типа сущности CourseGrade.
Нажмите ОК.
Метод GetStudentGradesFunction Import добавляется в модель EDM.
Создание пользовательского интерфейса
В этой процедуре будет добавлен пользовательский интерфейс приложения CourseManager, чтобы можно было увидеть оценки выбранного учащегося.
Создание пользовательского интерфейса
Щелкните правой кнопкой мыши имя проекта CourseManager в окне Обозреватель решений, укажите пункт Добавить и выберите пункт Новый элемент.
Появится диалоговое окно Добавление нового элемента.
Выберите Форма Windows Forms, назначьте форме имя GradeViewer.vb или GradeViewer.cs и нажмите кнопку Добавить.
Новая форма будет добавлена к проекту и открыта в конструкторе форм. Форме назначается имя GradeViewer и текст GradeViewer.
Перетащите элемент управления ComboBox из области элементов в форму и установите Имя в значение studentList в окне Свойства.
Перетащите элемент управления DataGridView из области элементов в форму и установите Имя в значение gradeGridView в окне Свойства.
Дважды щелкните файл CourseViewer.vb или CourseViewer.cs в окне Обозреватель решений.
Файл откроется в конструкторе форм.
Перетащите в форму элемент управления Button. Установите Имя в значение viewGrades, а Текст — в значение ViewGrades.
Дважды щелкните элемент управления viewGradesButton.
Обработчик события viewGrades_Click добавляется в файл с фоновым кодом.
Добавьте следующий код в обработчик события viewGrades_Click:
Dim gradeViewer As New GradeViewer() gradeViewer.Visible = True
GradeViewer gradeViewer = new GradeViewer(); gradeViewer.Visible = true;
Создание пользовательского интерфейса завершено.
Получение типов сущностей с помощью хранимой процедуры
В этой процедуре будет добавлен код, который выполняет хранимую процедуру Function Import, ранее созданную из хранимой процедуры GetStudentGrades. Затем в коде выполняется привязка возвращенной коллекции EntityType к элементу управления DataGridView. Дополнительные сведения о привязке объектов к элементам управления см. в разделе Привязка объектов к элементам управления (платформа Entity Framework).
Получение типов сущностей с помощью хранимой процедуры
Открыв форму GradeViewer в конструкторе форм, дважды щелкните текст формы.
Открывается файл с фоновым кодом для GradeViewer.
Добавьте следующие инструкции using (C#) или Imports (Visual Basic):
Imports System.Data.Objects Imports System.Data.Objects.DataClasses
using System.Data.Objects; using System.Data.Objects.DataClasses;
Добавьте свойство к классу GradeViewer, представляющему контекст объекта:
' Create an ObjectContext instance based on SchoolEntity. Private schoolContext As SchoolEntities
// Create an ObjectContext instance based on SchoolEntity. private SchoolEntities schoolContext;
В обработчике события GradeViewer_Load добавьте следующий код. Этот код инициализирует контекст объекта и задает в качестве источника данных для элемента управления ComboBox запрос, который возвращает все типы Person, не имеющие значение null в свойстве EnrollmentDate.
' Initialize schoolContext. schoolContext = New SchoolEntities() ' Define the query to retrieve students. Dim studentQuery As ObjectQuery(Of Person) = schoolContext _ .Person.Where("it.EnrollmentDate is not null") _ .OrderBy("it.LastName") ' Execute and bind the studentList control to the query. studentList.DataSource = studentQuery _ .Execute(MergeOption.OverwriteChanges) studentList.DisplayMember = "LastName"
schoolContext = new SchoolEntities(); // Define the query to retrieve students. ObjectQuery<Person> studentQuery = schoolContext.Person .Where("it.EnrollmentDate is not null") .OrderBy("it.LastName"); // Execute and bind the studentList control to the query. studentList.DataSource = studentQuery .Execute(MergeOption.OverwriteChanges); studentList.DisplayMember = "LastName";
Возвратитесь к конструктору формы GradeViewer и дважды щелкните элемент управления studentListComboBox.
Обработчик события studentList_SelectedIndexChanged добавляется в файл с фоновым кодом.
Добавьте следующий код в обработчик события studentList_SelectedIndexChanged. Этот код выполняет GetStudentGradesFunctionImport и привязывает результаты к элементу управления DataGridView после выбора нового учащегося из раскрывающегося списка.
' Get the selected student so we can use the ' PersonID in the function import call. Dim currentStudent As Person = CType(Me.studentList _ .SelectedItem(), Person) ' Set the data source for the gradeGridView ' to the results returned by the GetStudentGrades ' Function Import. gradeGridView.DataSource = schoolContext _ .GetStudentGrades(currentStudent.PersonID)
// Get the selected student so we can use the // PersonID in the function import call. Person currentStudent = (Person)this.studentList .SelectedItem; // Set the data source for the gradeGridView // to the results returned by the GetStudentGrades // Function Import. gradeGridView.DataSource = schoolContext .GetStudentGrades(currentStudent.PersonID);
Нажмите клавиши Ctrl + F5, чтобы запустить приложение. После этого можно просмотреть сведения об оценках учащегося, щелкнув View Grades и выбрав учащегося из раскрывающегося списка в форме Grade Viewer.
Листинг кода
В этом разделе содержится окончательная версия файла с фоновым кодом для формы GradeViewer.
Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class GradeViewer
' Create an ObjectContext instance based on SchoolEntity.
Private schoolContext As SchoolEntities
Private Sub GradeViewer_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Initialize schoolContext.
schoolContext = New SchoolEntities()
' Define the query to retrieve students.
Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
.Person.Where("it.EnrollmentDate is not null") _
.OrderBy("it.LastName")
' Execute and bind the studentList control to the query.
studentList.DataSource = studentQuery _
.Execute(MergeOption.OverwriteChanges)
studentList.DisplayMember = "LastName"
End Sub
Private Sub studentList_SelectedIndexChanged(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles _
studentList.SelectedIndexChanged
' Get the selected student so we can use the
' PersonID in the function import call.
Dim currentStudent As Person = CType(Me.studentList _
.SelectedItem(), Person)
' Set the data source for the gradeGridView
' to the results returned by the GetStudentGrades
' Function Import.
gradeGridView.DataSource = schoolContext _
.GetStudentGrades(currentStudent.PersonID)
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 GradeViewer : Form
{
// Create an ObjectContext instance based on SchoolEntity.
private SchoolEntities schoolContext;
public GradeViewer()
{
InitializeComponent();
}
private void GradeViewer_Load(object sender, EventArgs e)
{
schoolContext = new SchoolEntities();
// Define the query to retrieve students.
ObjectQuery<Person> studentQuery = schoolContext.Person
.Where("it.EnrollmentDate is not null")
.OrderBy("it.LastName");
// Execute and bind the studentList control to the query.
studentList.DataSource = studentQuery
.Execute(MergeOption.OverwriteChanges);
studentList.DisplayMember = "LastName";
}
private void studentList_SelectedIndexChanged(object sender, EventArgs e)
{
// Get the selected student so we can use the
// PersonID in the function import call.
Person currentStudent = (Person)this.studentList
.SelectedItem;
// Set the data source for the gradeGridView
// to the results returned by the GetStudentGrades
// Function Import.
gradeGridView.DataSource = schoolContext
.GetStudentGrades(currentStudent.PersonID);
}
}
}
Следующие шаги
Хранимая процедура Function Import, которая получает коллекцию типов сущностей, создана успешно. Дополнительные сведения о поддержке хранимых процедур в Entity Framework см. в разделе Поддержка хранимых процедур (платформа Entity Framework). Дополнительные сведения о построении приложений, использующих платформу Entity Framework, см. в разделе Руководство по программированию (платформа Entity Framework).
См. также
Другие ресурсы
Сценарии конструктора моделей EDM ADO.NET
Задачи средств модели EDM