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

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

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

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

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

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

невозможно преобразовать из «строки ссылки» в «System.Data.Objects.ObjectParameter»

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

Изменить

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

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


person Chris    schedule 31.05.2011    source источник


Ответы (2)


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

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

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

person Ladislav Mrnka    schedule 31.05.2011
comment
Спасибо за ответ. Я пробовал то же самое, но проблема все еще сохраняется. Я могу запустить приложение, но когда я перехожу к нужному URL-адресу, я получаю то же сообщение об ошибке в файле edmx. - person Chris; 01.06.2011
comment
Какой тип имеет ваш выходной параметр в хранимой процедуре? - person Ladislav Mrnka; 01.06.2011
comment
Это строка, просто возвращает вставку, статус обновления с именем таблицы и другую связанную информацию. НВАРЧАР(1000) - person Chris; 01.06.2011
comment
Странно - должно работать. Сопоставлена ​​ли хранимая процедура для вставки или обновления объекта? - person Ladislav Mrnka; 01.06.2011
comment
Это может помочь: ссылка или эта ссылка - person stormwild; 15.11.2011
comment
Ладислав, а если мне не нужен результирующий набор? Я хотел бы получить только выходной параметр, потому что в моем случае хранимая процедура не возвращает набор результатов. Могу ли я прочитать значение выходного параметра? - person Rudolf Dvoracek; 22.10.2012
comment
Точно Рудольф. Одна из самых абсурдных вещей, которые я видел в сфере ORM. Если все, что мне нужно, это выходные параметры, мне не нужно обрабатывать набор результатов (когда его нет). - person Phillip Brandon Holmes; 14.07.2015

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);
}
person Faisal    schedule 09.09.2014