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

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

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

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

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

Для выполнения данного пошагового руководства требуется:

Настройка Project

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

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

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

  • выберите данные в меню слева, а затем в области шаблоны выберите ADO.NET EDM .

  • Введите ефвисспроксмодел. EDMX в поле имя файла и нажмите кнопку Добавить.

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

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

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

    Import Stored Procedures

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

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

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

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

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

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

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

Код вызывает две хранимые процедуры: жетстудентградес (Возвращает Студентградес для указанного StudentId) и жетдепартментнаме (Возвращает имя отдела в выходном параметре).  

    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 .