如何将值从存储过程返回到EF

我试图通过EF调用存储过程并从存储过程中检索返回值。 我用这个答案作为指导。 这是我的存储过程:

CREATE PROCEDURE [dbo].[usp_test] ( @result int OUT ) AS BEGIN --DO STUFF SET @result = 0 END 

以下是我如何从EF调用它:

 var status = new SqlParameter { ParameterName = "result", DbType = DbType.Int32, Direction = ParameterDirection.Output }; var result = context.Database.SqlQuery("EXEC usp_test @result", status); var wasSuccessful = result.First() == 1; if (!wasSuccessful) { //DO STUFF } 

我收到此错误消息:

数据阅读器有多个字段。 多个字段对EDM原语或枚举类型无效

我究竟做错了什么?

在程序结束前尝试select @result

 CREATE PROCEDURE [dbo].[usp_test] ( @result int OUT ) AS BEGIN --DO STUFF SET @result = 0 Select @result END 

希望它有效。

尝试添加.First(); 到最后…

 var result = context.Database.SqlQuery("EXEC usp_test @result", status).First(); 

我不这样你需要First() ,因为你要返回一个值,这只能用于IEnumerable – 但需要仔细检查。

 var wasSuccessful = result == 1; 

我想用存储过程返回插入行的新id。 所以我也做了一个OUTPUT参数。 在使用EF6的C#中,我得到如下:

 using System.Data.Entity.Core.Objects; ... db = new myEntities1(); ObjectParameter returnId = new ObjectParameter("returnId", DbType.Int64); db.postLogItem("New item.", returnId); MessageBox.Show("Logitem added. New returnId: " + (int)returnId.Value); 

存储过程中变量的名称需要与调用ObjectParameter的构造函数的名称匹配。

 CREATE PROCEDURE [dbo].[postLogItem] @description nvarchar(200), @returnId bigint OUTPUT AS BEGIN SET NOCOUNT ON; INSERT INTO dbo.LogItem ( time, description ) VALUES ( GETDATE(), @description ); SET @returnId = SCOPE_IDENTITY(); END 

将ParameterDirection.Output更改为ParameterDirection.ReturnValue

如果没有任何作用,那么您可以尝试这种替代方法

  1. 在PROC中计算结果并将其保存在数据库的表中
  2. 在EF代码中读取该表中的数据。

但是,如果你有一个可以并行运行许多这样的EF代码的并发系统,那么你的存储过程需要变得更复杂,以处理并发。

谢谢,希望这可能有所帮助。