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


Процедуры конструктора хранилище запросов

В этом пошаговом руководстве показано, как использовать конструктор Entity Framework (EF Designer) для импорта хранимых процедур в модель, а затем вызова импортированных хранимых процедур для получения результатов.

Обратите внимание, что Code First не поддерживает сопоставление хранимых процедур или функций. Однако можно вызывать хранимые процедуры или функции с помощью метода System.Data.Entity.DbSet.SqlQuery. Например:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

Необходимые компоненты

Для выполнения данного пошагового руководства необходимо выполнить следующие действия.

  • Последняя версия Visual Studio.
  • Пример базы данных учебного заведения.

Настройка проекта

  • Откройте Visual Studio 2012.
  • Выбор файла—> создание проекта>
  • В левой области щелкните Visual C#, а затем выберите шаблон консоли .
  • Введите EFwithSProcsSample в качестве имени.
  • Нажмите ОК.

Создание модели

  • Щелкните проект правой кнопкой мыши в Обозреватель решений и выберите "Добавить -> Новый элемент".

  • Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области шаблонов.

  • Введите EFwithSProcsModel.edmx для имени файла и нажмите кнопку "Добавить".

  • В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее".

  • Нажмите кнопку " Создать подключение".
    В диалоговом окне "Свойства подключения" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК".
    Диалоговое окно "Выбор подключения к данным" обновляется с помощью параметра подключения к базе данных.

  • В диалоговом окне "Выбор объектов базы данных" установите флажок "Таблицы ", чтобы выбрать все таблицы.
    Кроме того, выберите следующие хранимые процедуры в узле хранимых процедур и функций : GetStudentGrades и GetDepartmentName.

    Импорт хранимых процедур

    Начиная с Visual Studio 2012 конструктор EF поддерживает массовый импорт хранимых процедур. Импорт выбранных хранимых процедур и функций в модель сущностей проверяется по умолчанию.

  • Нажмите кнопку Готово.

По умолчанию результаты каждой импортированной хранимой процедуры или функции, возвращающей несколько столбцов, автоматически становятся новым сложным типом. В этом примере мы хотим сопоставить результаты функции GetStudentGrades с сущностью StudentGrade и результатами GetDepartmentName ни с кем (ни одно значение по умолчанию).

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

  • Щелкните правой кнопкой мыши область конструктора и выберите "Браузер моделей".
  • В браузере модели выберите "Импорт функций" и дважды щелкните функцию GetStudentGrades .
  • В диалоговом окне "Изменить импорт функции" выберите сущности и выберите StudentGrade.
    В верхней части диалогового окна "Импорт функций" установлен флажок "Импорт функций" позволяет сопоставить с составными функциями. Если этот флажок установлен, в раскрывающемся списке "Хранимая процедура/ имя функции" появится только компонуемые функции (функции с табличным значением). Если этот флажок не установлен, в списке будут отображаться только не компонуемые функции.

Использование модели

Откройте файл Program.cs, в котором определен метод Main. Добавьте следующий код в функцию Main.

Код вызывает две хранимые процедуры: GetStudentGrades (возвращает StudentGrades для указанного StudentId) и GetDepartmentName (возвращает имя отдела в выходном параметре).  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

Скомпилируйте и запустите приложение. Программа выдает следующие результаты.

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

Выходные параметры

Если используются выходные параметры, их значения не будут доступны до тех пор, пока результаты не будут прочитаны полностью. Это связано с базовым поведением DbDataReader, см . дополнительные сведения о получении данных с помощью DataReader .