Выходной параметр в хранимой процедуре в EF

у меня есть существующая база данных с большим количеством сложных хранимых процедур, и я хочу использовать эту процедуру через EF 4. Я сделал следующее:

  1. создал объект данных EF,Customer.
  2. добавлена хранимая процедура в EF
  3. щелкните правой кнопкой мыши на конструкторе EF и добавьте импорт функции.
  4. Имя Импорта Функции -MyFunction, сложного типа.

результирующий код:

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

Теперь моя хранимая процедура имеет выходной параметр, который я использовал для вызова ref (в WebForm). Но я получаю следующую ошибку:

не удается преобразовать из 'ref string' в - Система.Данные.Объекты.ObjectParameter'

пожалуйста, помогите

редактировать

когда я пытаюсь сохранить я получаю ниже ошибка

привязка функции сопоставления задает модель функции.Магазин.P_GetCustomer с неподдерживаемым параметром: o_MyString. Выходные параметры могут быть сопоставлены только через свойство RowsAffectedParameter. Используйте привязки результатов для возврата значений из вызова функции.

2 ответов


выходные параметры возвращаются в 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);
}