如何从Entity Framework向存储过程传递参数?

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

6

第一个问题是:使用哪个版本的Entity Framework?.NET 3.5?.NET 4?在.NET 4中,情况发生了显著的变化(并得到了改进!)。

其次:你想做什么:

  • 从数据库检索行

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

  • 将对实体的INSERT / UPDATE / DELETE操作映射到存储过程?

这些是三种非常不同的情况 - 所以我们需要知道你要做什么。

此外:只需使用Google(或Bing)进行搜索 - 有很多博客文章和教程可以向您展示如何做到这一点 - 快速列表:

还有成千上万个......

更新:好的,所以你想从数据库检索数据。在这种情况下,您需要执行以下步骤:

  • 转到您的EF模型(*.edmx文件)设计器
  • 右键单击并选择从数据库更新模型
  • 选择要使用的存储过程并按照向导进行操作

enter image description here

这将在您的物理存储模型中创建一个存储过程条目。接下来:
  • 转到 Model Browser(看到上面的上下文菜单了吗?它就在Update Model from Database正下方),导航到存储模型并找到您的存储过程
  • 右键单击该存储过程

enter image description here

  • 选择 Add Function Import 来将“函数”(存储过程)从物理存储模型导入到概念模型中(即您的实体上下文类)。

enter image description here

在这里,你有四个选择:

  • 你的存储过程可能不返回任何内容(就像在我的示例中一样)- 那么它只是你的上下文类上的一个方法,你可以调用该方法来执行某些操作
  • 你的存储过程可能返回一组标量值,例如INT值列表之类的 - 选择下拉列表中的适当值
  • 你的存储过程可能会从你的模型中返回实体,例如完整的Customer实体 - 在这种情况下,选择最后一个选项并选择要映射到的实体(在这种情况下,你的存储过程必须返回该实体的所有列)

或者:

  • 你的存储过程返回了一些东西 - 但既不是标量(不只是INT),也不是实体 - 在这种情况下,你可以选择第三个选项并定义一个新的复杂类型(一个类),该类将保存从存储过程返回的结果。

无论你选择哪种方式 - 基本上EF将在你的对象上下文类中创建一个方法,你可以调用该方法。你的存储过程需要的任何参数都将成为该方法的参数,因此你可以非常容易地传递例如字符串、整数等。


我正在使用.NET 4。我的存储过程从我查询的数据表中返回值。但是我想要从我的程序中向存储过程传递参数。 - Satish Nissankala
1
@marc_s,您基本上解释了如何导入 SP 并处理其返回值。但是您并没有真正回答如何在代码中传递参数,这才是主要问题。 - HelpASisterOut
@HelpASisterOut:导入基本上会在Entity Framework的上下文类上创建一个 方法,因此您甚至可以获得智能感知来了解应传递哪些参数以及它们的数据类型是什么。 - marc_s

3

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

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

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