Процедуры запроса конструктора

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

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

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

Требования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Щелкните правой кнопкой мыши область конструктора и выберите "Браузер моделей".
  • В браузере моделей выберите Импорт функций и дважды щелкните функцию 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 .