Entity Framework-возвращаемое значение хранимой процедуры
Я пытаюсь получить возвращаемое значение из хранимой процедуры. Вот пример такой хранимой процедуры:
select
Name,
IsEnabled
from
dbo.something
where
ID = @ID
if @@rowcount = 0
return 1
return
Это простой выбор. Если найдено 0 строк, мой результирующий набор будет равен null, но у меня все равно будет возвращаемое значение.
это плохой пример, так как это select, поэтому я уверен, что смогу найти, если будут возвращены 0 строк. Однако при вызовах Insert, delete или других нам нужно это возвращаемое значение, чтобы узнать, была ли проблема. Я не смог найти способ получить это возвращаемое значение. Я могу получить выходные значения, я могу получить результирующие наборы, но не возвращаемое значение.
Я могу получить возвращаемое значение, если я вызываю SQL вручную или даже если я запускаю SqlCommand
использование Entity Framework, но это не то, что я хочу сделать.
кто-нибудь когда-либо мог получить возвращаемое значение из хранимой процедуры с помощью Entity Framework?
Спасибо за помощь!
5 ответов
нет. Entity Framework не поддерживает богатые хранимые процедуры, поскольку это ORM, а не замена SQL.
Как вы уже обнаружили, Если вам нужно использовать реже (более продвинутый?) особенности хранимых процедур, вам придется использовать старые добрые ADO.NET.
Я думаю, что поддержка возвращаемых значений хранимой процедуры зависит от версии Entity framework. Хотя прямое возвращение значения не сработало для меня, мне удалось получить значение с помощью параметра выходной хранимой процедуры. Пример:
USE [YOUR_DB_NAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestReturnValue]
@InputValue int = 0,
@Result int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @Result = @InputValue
RETURN(@InputValue);
END
это тестовый код:
void TestReturnValue()
{
using (var db = new YourDBContext())
{
var result = new System.Data.Objects.ObjectParameter("Result", 0);
Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result));
Console.WriteLine("Output param {0}", result.Value);
}
}
и это выход:
SP returned -1
Output param 123
как вы видите, непосредственно возвращаемое значение выводит некоторый мусор, но выходные параметры работают!
эта статья содержит общую информацию о двух способы возврата значений из SP
надеюсь, что это помогает
Я смог получить возвращаемое значение (а также выходные и входные параметры) с Entity Framework 5 (но я думаю, что он работает с версии 4.x) использование первого подхода кода. Из Вашего сообщения я не вижу, какую версию EF вы используете и как вы делаете свое сопоставление; если вы считаете, что используете подход code-first здесь, вы можете найти мой пост с решением:
вы должны использовать "контекст.База данных.SqlQuery", и укажите тип вывода хранимой процедуры
var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault();
int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();
чтобы получить интересующий результат в EF, вы должны вернуть ту же структуру (не 1 и имя, IsEnabled) В этом запросе вы должны вернуть", например, 0 вместо 1 в условии if:
select Name, IsEnabled from dbo.something where ID = @ID if @@rowcount = 0 return '',0