EF中存储过程的输出参数

时间:2011-05-31 20:11:57

标签: stored-procedures entity-framework-4 output-parameter

我有一个包含大量复杂存储过程的现有数据库,我想通过EF 4使用这些过程。我已经完成了以下操作:

  1. 创建了一个EF数据对象Customer
  2. 在EF
  3. 中添加了存储过程
  4. 右键单击EF设计器并添加功能导入。
  5. 功能导入名称 - MyFunction,复杂类型。
  6. 结果代码:

    CustomerEntities entity = new CustomerEntities();
    var result = entity.MyFunction("XYZ", ref o_MyString);
    

    现在我的存储过程有一个输出参数,我以前用它来调用(在WebForm中)。但我收到以下错误:

      

    无法从'ref string'转换为   'System.Data.Objects.ObjectParameter'

    请帮忙

    修改

    当我尝试保存时,我收到以下错误

      

    映射函数绑定指定具有不受支持的参数的函数Model.Store.P_GetCustomer:o_MyString。输出参数只能通过RowsAffectedParameter属性进行映射。使用结果绑定从函数调用返回值。

2 个答案:

答案 0 :(得分:36)

输出参数在ObjectParameter实例中返回。所以你必须使用如下代码:

var oMyString = new ObjectParameter("o_MyString", typeof(string));
var result = ctx.MyFunction("XYZ", oMyString).ToList();
var data = oMyString.Value.ToString();

原因是函数导入不能使用ref参数,因为输出参数在您处理数据库结果集之前未填充=如果您不调用ToList或迭代存储过程的结果输出参数是空的。

答案 1 :(得分:2)

msdn建议如下:

CREATE PROCEDURE dbo.GetDepartmentName
     @ID INT ,
     @Name NVARCHAR(50) OUTPUT
AS
     SELECT   @Name = Name
     FROM     Department
     WHERE    DepartmentID = @ID

解决方案

using (SchoolEntities context = new SchoolEntities())
{
   // name is an output parameter.

   ObjectParameter name = new ObjectParameter("Name", typeof(String));
   context.GetDepartmentName(1, name);
   Console.WriteLine(name.Value);
}