Как получать типы сущностей с помощью хранимой процедуры (средства работы с моделью EDM).
В этом разделе показаны способы использования хранимой процедуры для получения коллекции типов сущностей. В этом пошаговом руководстве используется конструктор моделей EDM ADO.NET (конструктор сущностей) для импорта хранимой процедуры и создания импорта функции, который возвращает коллекцию типов сущностей.
Включение хранимой процедуры в концептуальную модель позволит вызывать хранимую процедуру из кода приложения. Хранимая процедура, добавленная в концептуальную модель, называется импортом функции. Импорт функции способен возвращать коллекции простых типов, сложных типов, типов сущностей или не возвращать никакие значения.
![]() |
---|
Чтобы импорт функции вернул тип сущности EntityType, столбцы, возвращаемые соответствующей хранимой процедурой, должны точно соответствовать скалярным свойствам возвращенного типа сущности EntityType. |
При создании EDMX-файла на основе базы данных мастер моделей EDM создает в режиме хранения элементы для каждой хранимой процедуры в базе данных. Соответствующие элементы добавляются в концептуальную модель при создании импорта функции. Дополнительные сведения о создании импорта функции см. в разделе Как импортировать хранимую процедуру (средства работы с моделью EDM).
Предварительные требования
Для работы с этим пошаговым руководством необходимо построить приложение CourseManager. Дополнительные сведения и инструкции см. в разделе Краткое руководство по платформе Entity Framework. После построения приложения необходимо изменить концептуальную модель путем создания импорта функции на основе хранимой процедуры GetStudentGrades.
![]() |
---|
Приложение CourseManager используется в качестве отправной точки во многих разделах пошагового руководства в данной документации, поэтому рекомендуется использовать для данного пошагового руководства копию приложения CourseManager, а не вносить изменения в первоначальный код CourseManager. |
В этом пошаговом руководстве предполагается, что читатель обладает основными навыками работы со средой Visual Studio и платформой .NET Framework, а также навыками программирования на языке Visual C# или Visual Basic.
Создание функции импорта
Ниже мы попробуем создать импорт функции на основе хранимой процедуры GetStudentGrades, которая включается в режим хранения приложения CourseManager.
Создание функции импорта
Откройте решение CourseManager в среде Visual Studio.
В обозревателе решений дважды щелкните файл School.edmx.
Файл School.edmx открывается в конструкторе моделей EDM ADO.NET (конструктор сущностей), а также открывается окно Обозреватель моделей.
Разверните узел EntityContainer:SchoolEntities в окне Обозреватель моделей.
В древовидном представлении являются видимыми папки Наборы сущностей, Наборы ассоциаций и Импортируемые функции.
Щелкните правой кнопкой мыши элемент Импортируемые функции и выберите Добавить импорт функции.
Откроется диалоговое окно Add Function Import.
Выберите GetStudentGrades из раскрывающегося списка Имя хранимой процедуры.
Введите GetStudentGrades в текстовом поле Имя функции импорта.
Выберите Сущности в качестве возвращаемого значения, а затем в соответствующем раскрывающемся списке выберите пункт StudentGrade.
Примечание
Можно установить возвращаемый тип StudentGrade, так как столбцы, возвращаемые хранимой процедурой GetStudentGrades (EnrollementID, StudentID, CourseID, и Grade), точно соответствуют скалярным свойствам типа сущности StudentGrade. Нажмите кнопку ОК.
В концептуальную модель добавится элемент управления GetStudentGrades Function Import.
Создание пользовательского интерфейса
В этой процедуре мы добавим пользовательский интерфейс приложения CourseManager, чтобы можно было увидеть оценки выбранного учащегося.
Создание пользовательского интерфейса
Щелкните правой кнопкой мыши имя проекта CourseManager в окне Обозреватель решений, укажите пункт Добавить и выберите пункт Новый элемент.
Появится диалоговое окно Добавление нового элемента.
Выберите Форма Windows Forms, назначьте форме имя GradeViewer.vb или GradeViewer.cs и нажмите кнопку Добавить.
Новая форма будет добавлена к проекту и открыта в конструкторе форм. Форме назначается имя GradeViewer и текст GradeViewer.
Перетащите элемент управления ComboBox из области элементов в форму и установите Имя в значение studentList в окне Свойства.
Перетащите элемент управления DataGridView из области элементов в форму и установите Имя в значение gradeGridView в окне Свойства.
Дважды щелкните файл CourseViewer.vb или CourseViewer.cs в окне Обозреватель решений.
Файл откроется в конструкторе форм.
Перетащите в форму элемент управления Button. Установите Имя в значение viewGrades, а Текст — в значение View Grades.
Дважды щелкните элемент управления viewGrades Button.
Обработчик события viewGrades_Click добавляется в файл с фоновым кодом.
Добавьте следующий код в обработчик события viewGrades_Click:
Dim gradeViewer As New GradeViewer() gradeViewer.Visible = True
GradeViewer gradeViewer = new GradeViewer(); gradeViewer.Visible = true;
Создание пользовательского интерфейса завершено.
Получение типов сущностей с помощью хранимой процедуры
В этой процедуре будет добавлен код, который выполняет импорт функции, ранее созданной из хранимой процедуры GetStudentGrades. Затем в коде выполняется привязка возвращенной коллекции EntityType к элементу управления DataGridView. Дополнительные сведения о привязке объектов к элементам управления см. в разделе Binding Objects to Controls (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 _ .People.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.People .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 и дважды щелкните элемент управления studentList ComboBox.
Обработчик события studentList_SelectedIndexChanged добавляется в файл с фоновым кодом.
Добавьте следующий код в обработчик события studentList_SelectedIndexChanged. Этот код выполняет GetStudentGrades Function Import и привязывает результаты к элементу управления 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) gradeGridView.Columns("Course").Visible = False gradeGridView.Columns("StudentID").Visible = False gradeGridView.Columns("Person").Visible = False gradeGridView.Columns("EnrollmentID").Visible = False gradeGridView.AllowUserToAddRows = False gradeGridView.AllowUserToDeleteRows = False
// 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); gradeGridView.Columns["Course"].Visible = false; gradeGridView.Columns["StudentID"].Visible = false; gradeGridView.Columns["Person"].Visible = false; gradeGridView.Columns["EnrollmentID"].Visible = false; gradeGridView.AllowUserToAddRows = false; gradeGridView.AllowUserToDeleteRows = false;
Нажмите клавиши 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 _
.People.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)
gradeGridView.Columns("Course").Visible = False
gradeGridView.Columns("StudentID").Visible = False
gradeGridView.Columns("Person").Visible = False
gradeGridView.Columns("EnrollmentID").Visible = False
gradeGridView.AllowUserToAddRows = False
gradeGridView.AllowUserToDeleteRows = False
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.People
.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);
gradeGridView.Columns["Course"].Visible = false;
gradeGridView.Columns["StudentID"].Visible = false;
gradeGridView.Columns["Person"].Visible = false;
gradeGridView.Columns["EnrollmentID"].Visible = false;
gradeGridView.AllowUserToAddRows = false;
gradeGridView.AllowUserToDeleteRows = false;
}
}
}
Следующие шаги
Импорт функции, получающей коллекцию типов сущностей, создан успешно. Дополнительные сведения о построении приложений, использующих платформу Entity Framework, см. в разделе ADO.NET Entity Framework.
См. также
Другие ресурсы
Сценарии средств работы с моделью EDM
Задачи средств модели EDM