这个问题在这里已经有了答案:
Getting data from stored procedure with Entity Framework
(4 个回答)
4年前关闭。
环境:
背景:存储过程在 EDMX 中。如果没有发生任何事情,我的存储过程将返回值设置为 0,如果有影响则设置为 1,如果有错误则设置为@@ERROR。
背景1:我的存储过程,
LTM_Lease_DeleteSubFiles
, 做 SET NOCOUNT ON
在顶部并使用 RETURN
设置返回值命令在存储过程的末尾。问题1:我的调用返回 -1,它甚至不在存储过程中:
var spResults = context.LTM_Lease_DeleteSubFiles(...)
背景2:我的存储过程
DOIOwnerChanges_Apply
用 RETURN
设置返回值命令在存储过程的末尾。问题 2 :我的调用返回的值 8 甚至在存储过程中都找不到:
var spResults = context.DOIOwnerChanges_Apply(...)
最佳答案
原因 - EF(包括 v6)的模板构建器错误地将 SP 设置为返回包含行计数而不是返回值的 INT,因为它错误地调用了错误的 ObjectContext.ExecuteFunction(在模板生成的类 YourDatabaseEntities 中找到,即子类的 DBContext)。
为什么 ExecuteFunction 错误? - 结果集错误地说明了更改行的行数,而不是返回值或输出参数,因为它调用了一个不同的 ExecuteFunction 来丢弃结果。
ObjectContext.ExecuteFunction 的飞越智能提示说“执行存储过程……;丢弃从函数返回的任何结果;并返回受执行影响的行数”而不是通常的“执行存储过程……”指定参数”。
为什么问题 1 是 -1 :我相信 SET NOCOUNT ON 导致 SP 不返回计数结果,并且 Microsoft 的 ExecuteFunction 将其作为错误代码返回。
为什么问题 2 是 8 : SP 返回了 8 行数据而不是返回值,因为微软使用了错误的 ExecuteFunction。
SP 修复问题 1 - 你必须注释掉 SET NOCOUNT ON 。
SP 修复问题 1 和 2 - 您必须更改存储过程以将 SELECT 命令作为最后一条语句而不是 RETURN 命令执行。
解决方案 - 1) 修复SP 后,从Function Imports 文件夹和Data Store 的SP 文件夹中删除SP。 [此更改导致 EF 模板生成器使 SP 调用成为可空 INT 的 ObjectResult 而不是单个 INT 结果。] 2) 使用“从数据库更新模型”将 SP 重新加载到 EDMX 3) 重建所有数据EDMX 所在的项目。 4) 退出 Visual Studio 并返回。 5) 重建整体解决方案。
其他解决方法 - 来源:Microsoft 的 David Browne - 1) 重写 SP,创建一个 OUTPUT 参数并在那里返回结果。 2) 遇到错误时执行 THROW 或 RAISERROR。
关于c# - Entity Framework (数据库优先)的存储过程返回结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590413/