Как получать типы сущностей с помощью хранимой процедуры (средства работы с моделью EDM).

В этом разделе показаны способы использования хранимой процедуры для получения коллекции типов сущностей. В этом пошаговом руководстве используется конструктор моделей EDM ADO.NET (конструктор сущностей) для импорта хранимой процедуры и создания импорта функции, который возвращает коллекцию типов сущностей.

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

Cc716672.note(ru-ru,VS.100).gifПримечание
Чтобы импорт функции вернул тип сущности EntityType, столбцы, возвращаемые соответствующей хранимой процедурой, должны точно соответствовать скалярным свойствам возвращенного типа сущности EntityType.

При создании EDMX-файла на основе базы данных мастер моделей EDM создает в режиме хранения элементы для каждой хранимой процедуры в базе данных. Соответствующие элементы добавляются в концептуальную модель при создании импорта функции. Дополнительные сведения о создании импорта функции см. в разделе Как импортировать хранимую процедуру (средства работы с моделью EDM).

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

Для работы с этим пошаговым руководством необходимо построить приложение CourseManager. Дополнительные сведения и инструкции см. в разделе Краткое руководство по платформе Entity Framework. После построения приложения необходимо изменить концептуальную модель путем создания импорта функции на основе хранимой процедуры GetStudentGrades.

Cc716672.note(ru-ru,VS.100).gifПримечание
Приложение CourseManager используется в качестве отправной точки во многих разделах пошагового руководства в данной документации, поэтому рекомендуется использовать для данного пошагового руководства копию приложения CourseManager, а не вносить изменения в первоначальный код CourseManager.

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

Создание функции импорта

Ниже мы попробуем создать импорт функции на основе хранимой процедуры GetStudentGrades, которая включается в режим хранения приложения CourseManager.

Создание функции импорта

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

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

    Файл School.edmx открывается в конструкторе моделей EDM ADO.NET (конструктор сущностей), а также открывается окно Обозреватель моделей.

  3. Разверните узел EntityContainer:SchoolEntities в окне Обозреватель моделей.

    В древовидном представлении являются видимыми папки Наборы сущностей, Наборы ассоциаций и Импортируемые функции.

  4. Щелкните правой кнопкой мыши элемент Импортируемые функции и выберите Добавить импорт функции.

    Откроется диалоговое окно Add Function Import.

  5. Выберите GetStudentGrades из раскрывающегося списка Имя хранимой процедуры.

  6. Введите GetStudentGrades в текстовом поле Имя функции импорта.

  7. Выберите Сущности в качестве возвращаемого значения, а затем в соответствующем раскрывающемся списке выберите пункт StudentGrade.

    Cc716672.note(ru-ru,VS.100).gifПримечание
    Можно установить возвращаемый тип StudentGrade, так как столбцы, возвращаемые хранимой процедурой GetStudentGrades (EnrollementID, StudentID, CourseID, и Grade), точно соответствуют скалярным свойствам типа сущности StudentGrade.

  8. Нажмите кнопку ОК.

    В концептуальную модель добавится элемент управления GetStudentGrades Function Import.

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

В этой процедуре мы добавим пользовательский интерфейс приложения CourseManager, чтобы можно было увидеть оценки выбранного учащегося.

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

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

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

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

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

  3. Перетащите элемент управления ComboBox из области элементов в форму и установите Имя в значение studentList в окне Свойства.

  4. Перетащите элемент управления DataGridView из области элементов в форму и установите Имя в значение gradeGridView в окне Свойства.

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

    Файл откроется в конструкторе форм.

  6. Перетащите в форму элемент управления Button. Установите Имя в значение viewGrades, а Текст — в значение View Grades.

  7. Дважды щелкните элемент управления viewGrades Button.

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

  8. Добавьте следующий код в обработчик события 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).

Получение типов сущностей с помощью хранимой процедуры

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

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

  2. Добавьте следующие инструкции using (C#) или Imports (Visual Basic):

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Добавьте свойство к классу GradeViewer, представляющему контекст объекта:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. В обработчике события 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";
    
  5. Возвратитесь к конструктору формы GradeViewer и дважды щелкните элемент управления studentList ComboBox.

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

  6. Добавьте следующий код в обработчик события 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