如何从实体框架将参数传递给存储过程?

时间:2011-11-30 19:48:40

标签: entity-framework stored-procedures parameters

我想知道如何从实体框架向存储过程发送参数?提前谢谢。

2 个答案:

答案 0 :(得分:6)

第一个问题是:实体框架的版本? .NET 3.5? .NET 4 ?? .NET 4中的事情发生了很大的变化(并得到了改进!)。

其次:你想做什么:

  • 从数据库中检索行

  • 执行没有返回值的存储过程

  • 将实体上的INSERT / UPDATE / DELETE操作映射到存储的proc ??

这是三个截然不同的场景 - 所以我们需要知道你的目标。

另外:只需使用Google(或Bing)进行搜索 - 有大量的博客文章和教程,向您展示如何操作 - 快速列表:

还有数千人......

更新:确定,因此您想要从数据库中检索数据。在这种情况下,您的步骤是:

  • 转到设计器中的EF模型(* .edmx文件)
  • 右键单击并选择Update Model from Database
  • 选择您要使用的存储过程并完成向导

enter image description here

这会在物理存储模型中为存储过程创建一个条目。下一个:

  • 转到Model Browser(请参阅上面的上下文菜单?它位于Update Model from Database下方),导航到存储模型并找到您的程序
  • 右键单击该程序

enter image description here

  • 选择Add Function Import,它将“功能”(存储过程)从物理存储模型导入概念模型(基本上是您的实体上下文类)。

enter image description here

在这里,您有四种选择:

  • 你的存储过程可能不会返回任何内容(比如在我的示例中) - 然后它只是你的上下文类中的一个方法,你可以调用它做某事
  • 您的存储过程可能会返回一组标量,例如INT值列表或其他内容 - 在下拉列表中选择适当的值
  • 您的存储过程可能会从模型中返回实体,例如完成Customer个实体 - 在这种情况下,选择最后一个选项并选择要映射到的实体(您的存储过程必须返回该实体的所有列,在本例中)

OR:

  • 你的存储过程会返回一些内容 - 但不仅仅是标量(不仅仅是INT),也不是实体 - 在这种情况下,你可以选择第三个选项并定义一个新的复杂类型(一个类)来保存从中返回的结果存储过程。

无论你做什么 - 基本上EF都会在你可以调用的对象上下文类中创建一个方法。存储过程需要的任何参数都是该方法的参数,因此您可以非常轻松地传入,例如字符串,整数等。

答案 1 :(得分:3)

另一种情况是需要使用多个OUTPUT参数调用存储过程。以下是完整的示例。

public void MyStoredProc(int inputValue, out decimal outputValue1, out decimal outputValue2)
{
    var parameters = new[] { 
        new SqlParameter("@0", inputValue), 
        new SqlParameter("@1", SqlDbType.Decimal) { Direction = ParameterDirection.Output }, 
        new SqlParameter("@2", SqlDbType.Decimal) { Direction = ParameterDirection.Output } 
    };

    context.ExecuteStoreCommand("exec MyStoredProc @InParamName=@0, @OutParamName1=@1 output, @OutParamName2=@2 output", parameters);

    outputValue1 = (decimal)parameters[1].Value;
    outputValue2 = (decimal)parameters[2].Value;
}

请注意使用的类型(十进制。)如果需要其他类型,请记住不仅要在方法参数列表中更改它,还要更改SqlDbType.XXX