Подтвердить что ты не робот

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

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

  • Создал объект данных EF, Customer.
  • Добавлена ​​хранимая процедура в EF
  • Щелкните правой кнопкой мыши на конструкторе EF и добавьте функцию импорта.
  • Имя импорта функции - MyFunction, сложный тип.

Итоговый код:

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

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

не может преобразовать из 'ref string' в 'System.Data.Objects.ObjectParameter'

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

Edit

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

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

4b9b3361

Ответ 1

Выходные параметры возвращаются в экземпляр ObjectParameter. Поэтому вы должны использовать код, например:

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

Причина заключается в том, что функция import не может использовать параметр ref, поскольку выходной параметр не заполняется до тех пор, пока вы не обработаете результирующий набор из базы данных = если вы не вызываете ToList или итерации результата хранимой процедуры, выходной параметр равен нулю.

Ответ 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);
}