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