如何在MVC中使用EF调用存储过程

11

我在MVC框架中使用Entity Framework和存储过程,有没有关于使用存储过程的好的教程?

考虑到我的存储过程非常复杂(一些超过了1000行),在这种情况下是否最好使用Enterprise Library?

注意:我使用存储过程是因为它们非常复杂。

3个回答

41

MVC在这种情况下绝对不相关。从EF调用存储过程的方式仍然相同。我猜你想使用存储过程,但实际上并不使用实体和LINQ-to-Entities(主要的EF特性),是吗?通常你需要:

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

您甚至不必使用函数导入,可以通过调用以下方式直接执行过程:

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

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

  • Entity Framework不喜欢返回动态结果集的存储过程(根据某些条件,结果集具有不同的列)
  • 实体框架不支持返回多个结果集的存储过程-有EFExtensions可以,但更像直接使用ADO.NET。

1
+1 太棒了!为什么 Stack Overflow 不允许我们给 +5 呢?感谢您的解释。我只是想知道,如果我使用 Enterprise Library,那么是否属于良好实践,因为我的存储过程返回多个结果集和一些输出参数。 - Chris
你能在没有EDMX文件的情况下使用存储过程吗? - Tom Stickel
1
@TomStickel:如果没有EDMX,您无法将存储过程映射到函数导入,但是您可以通过dbContext.Database.SqlQuerydbContext.Database.ExecuteSqlCommand执行存储过程。 - Ladislav Mrnka

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();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接