我想知道如何从实体框架向存储过程发送参数?提前谢谢。
答案 0 :(得分:6)
第一个问题是:实体框架的版本? .NET 3.5? .NET 4 ?? .NET 4中的事情发生了很大的变化(并得到了改进!)。
其次:你想做什么:
从数据库中检索行
执行没有返回值的存储过程
将实体上的INSERT / UPDATE / DELETE操作映射到存储的proc ??
这是三个截然不同的场景 - 所以我们需要知道你的目标。
另外:只需使用Google(或Bing)进行搜索 - 有大量的博客文章和教程,向您展示如何操作 - 快速列表:
还有数千人......
更新:确定,因此您想要从数据库中检索数据。在这种情况下,您的步骤是:
Update Model from Database
这会在物理存储模型中为存储过程创建一个条目。下一个:
Model Browser
(请参阅上面的上下文菜单?它位于Update Model from Database
下方),导航到存储模型并找到您的程序
Add Function Import
,它将“功能”(存储过程)从物理存储模型导入概念模型(基本上是您的实体上下文类)。
在这里,您有四种选择:
Customer
个实体 - 在这种情况下,选择最后一个选项并选择要映射到的实体(您的存储过程必须返回该实体的所有列,在本例中)OR:
无论你做什么 - 基本上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
。