Как вызвать хранимую процедуру в MVC с помощью EF

Где я могу получить хорошее руководство по инфраструктуре Entity с Сохраненной процедурой в среде MVC?

Лучше ли использовать библиотеку Enterprise в этом случае, когда у меня почти все, что записано в хранимой процедуре.

Примечание. Я использую хранимую процедуру, потому что они очень сложны, а некоторые из них более 1000 строк.

Ответ 1

MVC в этом случае абсолютно не связан. То, как вы называете хранимую процедуру из EF, будет тем же. Я предполагаю, что вы хотите использовать хранимые процедуры без фактического использования сущностей и linq-to-entity (основные функции EF), не так ли? Обычно вам нужно:

  • Файл EDMX (модель данных сущностей ado.net), в котором вы запускаете обновление из базы данных и добавляете все хранимые процедуры, которые хотите использовать. EDMX файл также генерирует производные ObjectContext и все сущности по умолчанию.
  • Затем вы должны перейти в Model Browser и создать импорт функций для каждой процедуры. Импорт функции будет создавать метод для производного ObjectContext, который позволит вам вызвать хранимую процедуру как любой другой метод .net.
  • Во время импорта функции вам придется создавать сложный тип (это может произойти автоматически) для набора результатов, возвращаемого из хранимой процедуры.

Вам также не нужно вообще использовать импорт функций и вы можете выполнять процедуры напрямую, вызывая либо:

  • objectContext.ExecuteSqlCommand("storedProcedureName", SqlParameters) для SP, не возвращающих набор записей
  • objectContext.ExecuteStoreQuery<ResultType>("storedProcedureName", SqlParameters) для SPs, возвращающих набор записей. ResultType должен иметь свойства с теми же именами, что и столбцы в наборе результатов. Он может работать только с плоскими типами (без вложенных объектов).

При использовании хранимых процедур существуют некоторые ограничения:

  • Фреймворк Entity не любит хранимые процедуры, которые возвращают динамические результирующие множества (на основе некоторого набора результатов условия имеют разные столбцы)
  • Структура Entity не поддерживает хранимые процедуры, возвращающие несколько наборов результатов - есть EFExtensions, но это больше похоже на выполнение ADO.NET напрямую.

Ответ 2

Если вы используете Entityframwork Code-first, таким образом вы можете использовать свою хранимую процедуру. В этом примере у меня есть четыре входных параметра.

var startDateTY = masterSales.PolicyStartDate;
var endateTY = masterSales.PolicyEndDate;
var startDatePY = masterSales.PolicyStartDate.Value.AddYears(-1);
var endatePY = masterSales.PolicyEndDate.Value.AddYears(-1);

var spParameters = new object[4];
spParameters[0] = new SqlParameter()
{
     ParameterName = "startDateTY",
     Value = startDateTY
};
spParameters[1] = new SqlParameter()
{
     ParameterName = "endateTY",
     Value = endateTY
};
spParameters[2] = new SqlParameter()
{
     ParameterName = "startDatePY",
     Value = startDatePY
};
spParameters[3] = new SqlParameter()
{
     ParameterName = "endatePY",
     Value = endatePY
};
var datalist = objContext.Database.SqlQuery<vMasterSalesAgentReport>("dbo.usp_GetSalesAgentReport @startDateTY,@endateTY,@startDatePY,@endatePY", spParameters).ToList();

Ответ 3

store = "sp_selectmark @regid='" + id + "'";
var st = db.ExecuteStoreQuery<Sp>("exec " + store).ToList();
GridView1.DataSource = st;
GridView1.DataBind();

или

string store = "";
store = "sp_inserttbreg @name='" + regobj.name + "',@age='" + regobj.age + "',@place='" + regobj.place + "',@gender='" + regobj.gender + "',@email='" + regobj.email + "',@fon='" + regobj.fon + "'";