Entity framework 存储过程返回不正确的标量值-1,而不是返回值
我试图从存储过程返回标量值。实际上,我想返回新创建的记录的ID,但我已将问题简化为一个存储过程,它接受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
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在存储过程中,它甚至不返回受影响的行数,因此得到-1
因此,您必须进行两项更改:
更改您的过程,使其不返回值,而是选择它,即,不要选择return@return
doSELECT@return AS alias
。请注意,您需要“作为别名”部分。别名可以是您想要的任何列名
更改存储过程的映射,使其需要一个int32
值。如果您有疑问,请参阅此
通过这种方式,您将读取返回值作为结果集,而不是返回值。不确定是否可以以任何合理的方式进行读取。。。谢谢你,大卫。这让我走上了正确的道路。因此,我所做的是更改存储过程以返回ObjectResult而不是int。然后,我对存储过程调用的结果执行SingleOrDefault(),从而生成我的int返回值。这是完整的代码。你试过了吗?诸如此类。这是唯一正确的答案。包含的www.devtoolshed.com链接正在转发到看似随机的站点。
ObjectResult<Nullable<int>>
int? response = 0;
response = myEntity.myStoredProcedure(var1, var2).FirstOrDefault();