Хранимые процедуры запроса конструктора

В этом пошаговом руководстве показано, как с помощью конструктора 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 Entity Data Model (Модель данных сущности ) на панели "Шаблоны".

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

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

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

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

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

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

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

По умолчанию результирующий тип каждой импортированной хранимой процедуры или функции, возвращающей несколько столбцов, автоматически становится новым сложным типом. В этом примере мы хотим сопоставить результаты функции 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 ".