如何通过EF调用MVC中的存储过程

时间:2011-06-02 19:54:07

标签: asp.net-mvc-3 entity-framework enterprise-library

我在哪里可以通过MVC框架中的存储过程获得有关实体框架的优秀教程?

在这种情况下,当我几乎所有内容都写在存储过程中时,使用Enterprise库是否更好。

注意:我正在使用存储过程,因为它们非常复杂,其中一些超过1000行。

3 个答案:

答案 0 :(得分:41)

MVC在这种情况下绝对不相关。从EF调用存储过程的方式仍然是相同的。我想你想使用存储过程而不实际使用实体和linq-to-entities(主要EF功能),不是吗?通常你需要:

  • EDMX文件(ado.net实体数据模型),您从数据库运行更新并添加要使用的所有存储过程。 EDMX文件还默认生成派生的ObjectContext和所有实体。
  • 接下来,您必须为每个程序转到Model Browser and create Function import。函数导入将在派生的ObjectContext上创建方法,这将允许您像任何其他.net方法一样调用存储过程。
  • 在函数导入期间,您必须为存储过程返回的结果集创建复杂类型(它可以自动发生)。

您也不必使用函数导入和you can execute procedures directly,只需调用:

  • objectContext.ExecuteSqlCommand("storedProcedureName", SqlParameters)表示SP没有返回记录集
  • objectContext.ExecuteStoreQuery<ResultType>("storedProcedureName", SqlParameters)用于返回记录集的SP。 ResultType必须具有与结果集中的列具有相同名称的属性。它只能用于平面类型(没有嵌套对象)。

使用存储过程时存在一些限制:

  • 实体框架不喜欢返回动态结果集的存储过程(基于某些条件结果集有不同的列)
  • 实体框架不支持返回多个结果集的存储过程 - 有EFExtensions但它更像是直接执行ADO.NET。

答案 1 :(得分:1)

如果您正在使用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();

答案 2 :(得分:0)

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 + "'";