msc*_*chu 5 stored-procedures entity-framework entity-framework-6
我试图从存储过程返回标量值.我实际上想要返回一个新创建的记录的ID,但我已经将我的问题简化为一个存储过程,该存储过程需要int并尝试返回相同的内容int.这总是返回-1.非常感谢您的帮助.
Web API控制器调用
var idtest = dbconn.my_return_int(123);
Run Code Online (Sandbox Code Playgroud)
存储过程:
ALTER PROCEDURE [dbo].[my_return_int]
@ID int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @return as int
SET @return = -999
RETURN @return
END
Run Code Online (Sandbox Code Playgroud)
该Context生成的存储过程调用
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);
}
Run Code Online (Sandbox Code Playgroud)
要解决这个实体框架问题,并假设您已经有一个存储过程在工作,并且您不想使用其他方式修复它可以正常工作的地方,那么 EF 您可以替换:
RETURN(0)
Run Code Online (Sandbox Code Playgroud)
和:
BEGIN
SELECT(0)
RETURN(0)
END
Run Code Online (Sandbox Code Playgroud)
也就是说,如果它是 IF 语句的一部分,
则?转到:EF模型(.edmx)->模型浏览器->函数导入->(双击您的函数)->标量-> Int32
现在你的返回值是:
ObjectResult<Nullable<int>>
Run Code Online (Sandbox Code Playgroud)
你可以通过写信来接收它:
int? response = 0;
response = myEntity.myStoredProcedure(var1, var2).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
或在图片中:
1。

2.

3.
完成所有这些使得 EF 模型 (.edmx) 也支持“从数据库更新模型...”,您可以更新它而不必担心刚刚所做的更改。
执行ObjectContext.ExecuteFunction结果时:
来自MSDN:丢弃从该函数返回的任何结果; 并返回受执行影响的行数
即它不返回输出参数,因为它不知道有一个.此外,正如您SET NOCOUNT ON;在存储过程中调用的那样,它不会返回受影响的行数,因此您得到-1.
所以,你必须做两个改变:
RETURN @return办SELECT @return AS alias.请注意,您需要"AS别名"部分.在alias可以任何你想要的列名.int32值.如果您有疑问,请参阅此链接.这样,您将读取返回值作为结果集,而不是返回值.
谢谢 DavidG 的文章。它让我开始走上正确的道路。因此,我为解决此问题所做的是将我的存储过程更改为返回一个ObjectResult<int?>而不是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.
Run Code Online (Sandbox Code Playgroud)
然后,我生成的代码看起来像上面,但不是返回一个,而是int返回一个ObjectResult<int?>
我读到的结果是这样的:
var id = myDbContext.My_Return_Int(123).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6721 次 |
| 最近记录: |