EF 4.1 Code First:执行存储过程并返回IDENT

时间:2011-06-30 21:18:08

标签: sql entity-framework stored-procedures entity-framework-4.1 ef-code-first

我正在尝试使用context.Database来执行插入记录并返回标识的存储过程。我知道我的proc工作,使用输出参数,选择或返回,但我无法让ExecuteSqlCommandSqlQuery<int>返回身份。

使用带有return的存储过程

INSERT INTO TableA (FieldA, FieldB)
RETURN SCOPE_IDENTITY

我看到SSMS的返回值为1010966

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

但我在我的应用程序中所做的一切都没有返回有效值。

Int64 result = context.Database.ExecuteSqlCommand

总是返回3,并且在使用SqlQuery<int>时我得到一个引用Decimal的转换错误。 我尝试使用输出参数,但无法让代码正确执行,因此专注于使用SELECT SCOPE_IDENTITYRETURN SCOPE_IDENTITY

的应用

如果没有创建模型来替换存储过程中包含的逻辑,我可以使用任何和所有建议来返回存储过程和应用程序级别的值。

1 个答案:

答案 0 :(得分: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")

我的结果是递增的返回值。希望这会有所帮助。