实体框架和SCOPE_IDENTITY

时间:2013-08-27 17:38:51

标签: c# sql-server entity-framework stored-procedures scope-identity

我有一个插入表中的存储过程然后执行此行

SET @returnVal = SCOPE_IDENTITY();

之后我尝试了两个:

SELECT @returnVal

return @returnVal

当我从Microsoft SQL Server Management Studio执行存储过程时,我得到了SELECT @returnVal的预期结果 - 选择了插入数据的标识列。

但是,当我将存储过程添加到我的ADO.Net实体数据模型/ EntityFramework类/ .edmx类并在我的C#代码中执行存储过程时,我得到了返回的值-1。

是否有可能获得我想要的值,新的身份值,返回?

我意识到我可以手动将存储过程绑定到模型中表的插入操作 - 但这不是一个选项。每次重新生成我的模型类时,都有太多的插入程序来完成这个手动工作。

4 个答案:

答案 0 :(得分:2)

在过程定义中声明参数的输出类型:

 create procedure [dbo].[Procedurename] @returnVal int output
 as 
 SET @returnVal = SCOPE_IDENTITY();

并在调用存储过程时将其命名为:

 declare @returnVal int
 exec Procedurename @returnVal output
 print @returnVal 

答案 1 :(得分:0)

context.Database.ExecuteSqlCommand返回命令执行结果而不是查询结果。 如果您需要获取数据而不是使用context.Database.SqlQuery

SET @ReturnVal=SCOPE_IDENTITY()然后使用select。

实施例: How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? EF Code First CTP5

答案 2 :(得分:0)

取自OPs问题

添加输出参数(答案标记如下)。

存储过程签名现在看起来像这样:

我的存储过程签名现在看起来像这样:

CREATE PROCEDURE SP_MyStoreProc ([Multiple Parameters], @returnVal int output)

存储过程的最后一行是:

return @returnVal

我的C#代码现在看起来像这样:( db是我的dbContext类的一个实例)

System.Data.Objects.ObjectParameter identityParameter = 
new System.Data.Objects.ObjectParameter("returnVal", 0);

db.SP_MyStoredProc([Multiple Parameters], identityParameter);

int myNewIdentity = Convert.ToInt32(identityParameter.Value);

答案 3 :(得分:0)

如果您打开 edmx 文件并右键单击模型浏览器中的函数导入,您可以告诉实体框架该存储过程返回一个标量集合。然后,您基本上可以使用 mycontext.mysproc().Single() 调用 sproc 以获取 ID。