Entity framework 存储过程返回不正确的标量值-1,而不是返回值

Entity framework 存储过程返回不正确的标量值-1,而不是返回值,entity-framework,stored-procedures,entity-framework-6,Entity Framework,Stored Procedures,Entity Framework 6,我试图从存储过程返回标量值。实际上,我想返回新创建的记录的ID,但我已将问题简化为一个存储过程,它接受int并尝试返回相同的int。这总是返回-1。非常感谢你的帮助 Web API控制器调用 var idtest = dbconn.my_return_int(123); 存储过程: ALTER PROCEDURE [dbo].[my_return_int] @ID int AS BEGIN SET NOCOUNT ON; DECLARE @retur

我试图从存储过程返回标量值。实际上,我想返回新创建的记录的ID,但我已将问题简化为一个存储过程,它接受
int
并尝试返回相同的
int
。这总是返回-1。非常感谢你的帮助

Web API控制器调用

var idtest = dbconn.my_return_int(123);
存储过程:

ALTER PROCEDURE [dbo].[my_return_int]  
    @ID int  
AS  
BEGIN  
    SET NOCOUNT ON;  
    DECLARE @return as int

    SET @return = -999

RETURN @return
END   
上下文
生成的存储过程调用

public virtual int my_return_int(Nullable<int> iD)  
{  
    var iDParameter = iD.HasValue ?
        new ObjectParameter("ID", iD) :
        new ObjectParameter("ID", typeof(int));

    return (IObjectContextAdapter)this).ObjectContext.ExecuteFunction("my_return_int", iDParameter);  
}  
公共虚拟整数my\u return\u int(可为空的iD)
{  
var iDParameter=iD.HasValue?
新的ObjectParameter(“ID”,ID):
新的ObjectParameter(“ID”,typeof(int));
return(IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“my_return_int”,iDParameter);
}  

谢谢你,大卫。这让我走上了正确的道路。因此,我所做的是更改存储过程以返回
ObjectResult
,而不是
int
。然后,我对存储过程调用的结果执行了
SingleOrDefault()
,这产生了我的
int
返回值。像这样:

存储过程:

-- RETURN @return does not work. Can't return a scalar value  
SELECT @return  -- This returns a result set with a single object that contains an int.
然后,我生成的代码如上所示,但它没有返回
int
,而是返回
ObjectResult

我读到的结果如下:

var id = myDbContext.My_Return_Int(123).SingleOrDefault();

我刚刚在我的项目中实现了另一个选项。我为@return输入了另一个输出参数。

为了解决这个实体框架问题,假设您已经有一个存储过程在工作,并且您不想使用其他方法修复它工作正常的地方,那么您可以替换:

RETURN(0)
与:

也就是说,如果它是if语句的一部分,
请访问: EF模型(.edmx)->模型浏览器->函数导入->(双击函数)->标量->Int32

现在您的返回值为:

ObjectResult<Nullable<int>>
或在图片中:
1.

2.

3.


执行所有这些操作后,EF模型(.edmx)也支持“从数据库更新模型…”,您无需担心刚做的更改即可进行更新。

当您执行
ObjectContext.ExecuteFunction
时,结果是:

:放弃从函数返回的任何结果;并返回受执行影响的行数

也就是说,它不返回输出参数,因为它不知道有输出参数。此外,正如您所调用的
SET NOCOUNT ON
因此,您必须进行两项更改:

  • 更改您的过程,使其不返回值,而是选择它,即,不要选择
    return@return
    do
    SELECT@return AS alias
    。请注意,您需要“作为别名”部分。
    别名可以是您想要的任何列名
  • 更改存储过程的映射,使其需要一个
    int32
    值。如果您有疑问,请参阅此

  • 通过这种方式,您将读取返回值作为结果集,而不是返回值。

    不确定是否可以以任何合理的方式进行读取。。。谢谢你,大卫。这让我走上了正确的道路。因此,我所做的是更改存储过程以返回ObjectResult而不是int。然后,我对存储过程调用的结果执行SingleOrDefault(),从而生成我的int返回值。这是完整的代码。你试过了吗?诸如此类。这是唯一正确的答案。包含的www.devtoolshed.com链接正在转发到看似随机的站点。
    ObjectResult<Nullable<int>>
    
    int? response = 0;
    response = myEntity.myStoredProcedure(var1, var2).FirstOrDefault();