c# - Entity Framework (数据库优先)的存储过程返回结果不正确

标签 c# sql-server entity-framework stored-procedures entity-framework-6

这个问题在这里已经有了答案:





Getting data from stored procedure with Entity Framework

(4 个回答)


4年前关闭。




环境:

  • Visual Studio 2017
  • SQL Server 2016
  • 采用数据库优先方法的 EF v6

  • 背景:存储过程在 EDMX 中。如果没有发生任何事情,我的存储过程将返回值设置为 0,如果有影响则设置为 1,如果有错误则设置为@@ERROR。

    背景1:我的存储过程,LTM_Lease_DeleteSubFiles , 做 SET NOCOUNT ON在顶部并使用 RETURN 设置返回值命令在存储过程的末尾。

    问题1:我的调用返回 -1,它甚至不在存储过程中:
    var spResults = context.LTM_Lease_DeleteSubFiles(...)
    

    背景2:我的存储过程 DOIOwnerChanges_ApplyRETURN 设置返回值命令在存储过程的末尾。

    问题 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/

    相关文章:

    c# - 如何使用 NPOI c# 将 xls 文件保存为 xlsx 文件?

    c# - 将聚合函数作为参数传递

    sql - 如何自增非主键? - SQL服务器

    entity-framework - Entity Framework - Azure 上的迁移 - 现实场景 - 降级数据库

    c# - 在C#应用程序中创建大量线程的性能影响

    sql - 在普通 sql 中对行进行分组

    javascript - NodeJS/mssql 错误处理差异

    c# - 对实体执行 CRUD 操作的最佳实践( Entity Framework )

    c# - 实体类型 <type> 不是当前上下文模型的一部分

    c# - C# 中模态形式和非模态形式有什么区别?