Код EF 4.1 первый: выполнить сохраненный процесс и вернуть IDENT - PullRequest
1 голос
/ 01 июля 2011

Я пытаюсь использовать context.Database для выполнения сохраненного процесса, который вставляет запись и возвращает идентификатор. Я знаю, что моя процедура работает с использованием выходного параметра, выбора или возврата, но я не могу получить либо ExecuteSqlCommand, либо SqlQuery<int>, чтобы вернуть идентификатор.

Используя сохраненный процесс с возвратом,

INSERT INTO TableA (FieldA, FieldB)
RETURN SCOPE_IDENTITY

Я вижу возвращаемое значение 1010966 из SSMS

DECLARE @return_value int
EXEC    @return_value = spInsertRecord
SELECT  'Return Value' = @return_value

Но ничего из того, что я сделал в своем приложении, не возвращает действительного значения.

Int64 result = context.Database.ExecuteSqlCommand

всегда возвращает 3, и я получаю ошибку при обращении к десятичной дроби при использовании SqlQuery<int>. Я попытался с выходным параметром, но не смог заставить код работать правильно, поэтому сосредоточился на приложении, потребляющем либо SELECT SCOPE_IDENTITY, либо RETURN SCOPE_IDENTITY

За исключением создания моделей для замены логики, содержащейся в хранимой процедуре, я открыт для любых предложений по возврату значения как для сохраненного процесса, так и для уровня приложения.

1 Ответ

1 голос
/ 23 сентября 2011

Вот как вы можете заставить это работать. В этом примере мой EntityManager - это просто класс, который наследуется от DBContext.

Таблица испытаний:

CREATE TABLE [dbo].[TableA](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FieldA] [nvarchar](50) NULL,
    [FieldB] [nvarchar](50) NULL
) ON [PRIMARY]

Сохраненный процесс:

CREATE PROC spInsertRecord
    @FieldA NVARCHAR(50),
    @FieldB NVARCHAR(50)
AS

INSERT  TableA
    (FieldA, FieldB)
VALUES  
    (@FieldA, @FieldB)

SELECT  CAST(@@IDENTITY AS INT)

Телефонный код (VB.NET)

Public Shared Function AddRecord(FieldA As String, FieldB As String) As Integer
    Try
        Using EM As New EntityManager
            Return EM.Database.SqlQuery(Of Integer)(
                "EXEC spInsertRecord @FieldA, @FieldB",
                New SqlParameter("FieldA", FieldA),
                New SqlParameter("FieldB", FieldB)).SingleOrDefault
        End Using
    Catch ex As Exception
        Throw New ApplicationException("An error occurred while executing AddRecord", ex)
    End Try
End Function

Код потребления:

Return AddRecord("Tom", "Halladay")

Мой результат - возрастающее возвращаемое значение. Надеюсь, это поможет.

...