EF中存储过程的输出参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF中存储过程的输出参数相关的知识,希望对你有一定的参考价值。
我有一个包含大量复杂存储过程的现有数据库,我想通过EF 4使用这些过程。我已经完成了以下操作:
- 创建了一个EF数据对象
Customer
。 - 在EF中添加了存储过程
- 右键单击EF设计器并添加功能导入。
- 功能导入名称 -
MyFunction
,复杂类型。
结果代码:
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属性进行映射。使用结果绑定从函数调用返回值。
答案
输出参数在ObjectParameter
实例中返回。所以你必须使用如下代码:
var oMyString = new ObjectParameter("o_MyString", typeof(string));
var result = ctx.MyFunction("XYZ", oMyString).ToList();
var data = oMyString.Value.ToString();
原因是函数导入不能使用ref参数,因为在处理数据库中的结果集之前,输出参数未填充=如果不调用ToList
或迭代存储过程的结果,则输出参数为null。
另一答案
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); }
以上是关于EF中存储过程的输出参数的主要内容,如果未能解决你的问题,请参考以下文章