Entity Framework имеет возможность автоматически строить собственные команды для базы данных на основе LINQ to Entities или запросов Entity SQL, а также, строить этих команд для вставки, обновления или удаления данных.
Вы можете переопределить эти команды и использовать свои собственные предопределенные хранимые процедуры. А также можете использовать хранимые процедуры либо для получения данных или добавления / обновления / удаления записей в одной или нескольких таблиц базы данных. [1]
Хранимая процедура представляет собой оформленный особым образом сценарий (вернее, пакет), который хранится в базе данных, а не в отдельном файле. Хранимые процедуры отличаются от сценариев тем, что в них допускается использование входных и выходных параметров, а также возвращаемых значений, которые фактически не могут использоваться в обычном сценарии.
Основным языком программирования для СУБД SQL SERVER продолжает оставаться T-SQL, который не обеспечивает такую же поддержку разносторонних способов управления ходом выполнения программы, как процедурные языке наподобие C, C++, Visual Basic, Java, Delphi и т. д. Однако T-SQL становится буквально непревзойденным, когда с его помощью осуществляются операции определения данных, манипулирования данными и доступа к данным, а предусмотренные в нем процедурные конструкции позволяют вполне успешно решать большинство практических задач. [2]
Хранимые процедуры и определяемые пользователем функции (UDF) в базе данных представлены в виде функций в рамках сущности. EDM не будет иметь какой-либо объект для хранимых процедур в дизайнере EDM. [1]
Здесь мы добавим следующую хранимую процедуру StudentByGroupId в EDM. Эта процедура возвращает всех студентов, которые назначены для конкретной группы:
CREATE PROCEDURE [dbo].[StudentByGroupId]
@GId int = null
-- Здесь добавлять параметры процедуры
AS
BEGIN
SET NOCOUNT ON;
SELECT s.Id, s.sname,s.GroupId,g.gname
from Student s Inner Join GroupStudent g ON s.GroupId=g.Id
where s.GroupId=@GId
END
Во-первых, создайте новую модель данных объекта ADO.Net, используя EF Designer from database.
Выберите StudentByGroupId. Убедитесь, что Import selected stored procedures and functions into the entity model установлен флажок, а затем нажмите кнопку Finish.
Вы увидите StudentByGroupId добавлен в Function Imports с новым сложным типом StudentByGroupId _Result в Model Browser. Всякий раз, когда вы импортируйте хранимую процедуру в модель, она создает новый сложный тип с именем {sp name} _Result по умолчанию. [3]
Рис 1. Окно Model Browser
StudentByGroupId возвращает те же поля, определенные в сущности студент. Таким образом, нам не нужно добавлять новый сложный тип возвращаемых данных из StudentByGroupId. Вы можете изменить его, щелкнув правой кнопкой мыши на StudentByGroupId импорта функций и нажмите Edit. Проверьте Entities и выберите из выпадающего списка Student в всплывающем окне, как показано ниже [3, c. 237]
Рис 2. Окно Edit Function Import
Теперь StudentByGroupId может быть вызван и результат, показанный ниже, будут возвращены:
public ActionResult Index()
{ var context = new StudentDateBaseEntities();
var student = context.StudentByGroupId(1);
return View(student.ToList()); }
Код, показанный выше, выполнит следующий оператор:
Exec [DBO]. [StudentByGroupId] @ GId = 1
Литература:
- Julia Lerman. Programming Entity Framework, Second Edition. 2010. Printed in the United States of America.
- Виейра, Роберт. Программирование баз данных Microsoft SQL Server 2005. Базовый курс: Пер. с англ. — М.: ООО “И. Д. Вильямс”, 2007. — 832с.: ил. — Парал. тит. англ.
- Julia Lerman, Rowan Miller. Programming Entity Framework: DbContext. 2012. Printed in the United States of America.
- Tom Dykstra, Rick Anderson. Getting Started with Entity Framework 6 Code First using MVC 5. 2014.