1

我正在嘗試使用context.Database來執行一個存儲過程,該過程插入一條記錄並返回該標識。我知道我的過程,使用輸出參數,選擇或返回,但我不能讓ExecuteSqlCommandSqlQuery<int>返回身份。EF 4.1代碼優先:執行存儲過程並返回IDENT

使用帶有返回一個存儲過程,

INSERT INTO TableA (FieldA, FieldB) 
RETURN SCOPE_IDENTITY 

我看到SSMS

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

1010966一個返回值,但沒有我在我的應用程序進行返回一個有效的值。

Int64 result = context.Database.ExecuteSqlCommand 

總是返回3,我得到一個錯誤的鑄造用SqlQuery<int>時參考小數。 我做了一個輸出參數的嘗試,但無法讓代碼正確執行,所以都集中在應用消費創建模型來代替包含在存儲邏輯的任何SELECT SCOPE_IDENTITYRETURN SCOPE_IDENTITY

短過程中,我願意爲返回Stored Proc和應用程序級別的值的所有建議。

回答

1

以下是您如何獲得這項工作。在這個例子中,我的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") 

我的結果是遞增的返回值。希望這可以幫助。