2011-11-30 157 views

回答

6

第一个问题是:针对实体框架的版本? .NET 3.5? .NET 4 ??事情已经改变了显著(和改进!)在.NET 4

其次:你想做什么:

  • 从数据库

  • 检索行执行一个存储过程,而不返回值

  • 地图插入/更新/删除的实体操作,一个存储过程??

这些是三个不同的场景 - 所以我们需要知道你要做什么。

另外:刚刚与谷歌(或Bing)搜索 - 有博客文章的大量和教程在那里向您展示如何做到这一点 - 一个快速列表:

和数以千计更多......

更新:好了,你想从数据库中检索数据。在这种情况下,你的步骤是:

  • 去你的EF模型(* .edmx文件)在设计
  • 右键单击并选择Update Model from Database
  • 选择你要使用的存储过程和去通过向导

enter image description here

这将创建存储过程中的条目您物理储存模式。下一页:

  • 转到Model Browser(?见上面的上下文菜单刚好低于Update Model from Database),导航到存储模型,找到你的程序
  • 该过程的

enter image description here右击

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

enter image description here

在这里,你有四种选择:

  • 您的存储过程可能不会(我的样品等)任何回报 - 那么它只是一个方法,你的上下文类,你可以调用这个函数
  • 你的存储过程可能返回一个标量集合,例如INT值列表或其他内容 - 在下拉列表中选择适当的值
  • 您的存储过程可能会从您的模型返回个实体,例如,完整Customer实体 - 在这种情况下,选择最后一个选项,并选择您想要映射到实体(你的存储过程必须返回所有列的是实体,在这种情况下)

OR:

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

无论你做 - 基本上EF将建立一个关于您的对象上下文类方法,你可以调用。您存储的proc所需的任何参数将为该方法的参数,因此您可以非常轻松地通过例如。字符串,整数等

+0

我使用的是.NET 4.我的存储过程从我正在查询的数据表中返回值。但我想从我的程序中传递参数给我的存储过程。 –

+0

@SatishNissankala:大大更新了我的回复 - 有帮助吗? –

+0

Thankyou marc_s。这真的很有帮助。 –

2

另一种情况是需要调用具有多个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 @[email protected], @[email protected] output, @[email protected] output", parameters); 

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

请注意使用的类型(十进制)。如果需要另一种类型,记得不仅改变它在方法参数列表也是SqlDbType.XXX

相关问题