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


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

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

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

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

Чтобы хранимая процедура Function Import возвратила тип сущности EntityType, столбцы, возвращенные соответствующей хранимой процедурой, должны точно соответствовать свойствам возвращенного типа сущности EntityType.

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

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

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

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

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

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

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

В этом процессе будет создана хранимая процедура Function Import на основе хранимой процедуры GetStudentGrades, которая включается в модель хранения CourseManager EDM.

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

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

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

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

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

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

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

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

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

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

  7. Выберите CourseGrade из раскрывающегося списка Тип возвращаемых данных.

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

    Можно установить возвращаемый тип CourseGrade, так как столбцы, возвращаемые хранимой процедурой GetStudentGrades (EnrollementID и Grade), точно соответствуют скалярным свойствам типа сущности CourseGrade.

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

    Метод GetStudentGradesFunction Import добавляется в модель EDM.

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

В этой процедуре будет добавлен пользовательский интерфейс приложения 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, а Текст — в значение ViewGrades.

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

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

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

    Dim gradeViewer As New GradeViewer()
    gradeViewer.Visible = True
    
    GradeViewer gradeViewer = new GradeViewer();
    gradeViewer.Visible = true;
    

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

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

В этой процедуре будет добавлен код, который выполняет хранимую процедуру Function Import, ранее созданную из хранимой процедуры GetStudentGrades. Затем в коде выполняется привязка возвращенной коллекции EntityType к элементу управления DataGridView. Дополнительные сведения о привязке объектов к элементам управления см. в разделе Привязка объектов к элементам управления (платформа 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 _
        .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";
    
  5. Возвратитесь к конструктору формы GradeViewer и дважды щелкните элемент управления studentListComboBox.

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

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