【问题标题】:Entity Framework (Database first) has incorrect return result from stored procedure [duplicate]实体框架(数据库优先)从存储过程返回不正确的结果[重复]
【发布时间】:2017-10-05 16:19:34
【问题描述】:

环境:

  • 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(...)

BACKGROUND 2:我的存储过程DOIOwnerChanges_Apply 在存储过程结束时使用RETURN 命令设置返回值。

问题 2:我的调用返回的值 8 甚至在存储过程中都找不到:

var spResults = context.DOIOwnerChanges_Apply(...)

【问题讨论】:

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


    【解决方案1】:

    原因 - EF(包括 v6)的模板构建器错误地将 SP 设置为返回包含行数而不是返回值的 INT,因为它错误地调用了错误的 ObjectContext.ExecuteFunction(找到在模板生成的类 YourDatabaseEntities 中,它是 DBContext 的子类)。

    为什么错误的ExecuteFunction? - 结果集错误地表示已更改行的行数,而不是返回值或输出参数,因为它调用了丢弃结果的不同 ExecuteFunction。 ObjectContext.ExecuteFunction 的天桥智能提示说“执行存储过程……;丢弃从函数返回的任何结果;并返回受执行影响的行数”而不是通常的“执行一个存储过程……带有指定的参数”。

    为什么问题 1 是 -1:我相信 SET NOCOUNT ON 导致 SP 不返回任何计数结果,并且 Microsoft 的 ExecuteFunction 将其作为错误代码返回。

    WHY PROBLEM 2 IS 8:SP 返回 8 行数据而不是返回值,因为 Microsoft 使用了错误的 ExecuteFunction。

    SP FIX TO PROBLEM 1 - 你必须注释掉 SET NOCOUNT ON 。

    SP 修复问题 1 和 2 - 您必须更改存储过程以执行 SELECT 命令作为最后一条语句,而不是 RETURN 命令。

    解决方案修复 - 1) 修复 SP 后,从 Function Imports 文件夹和 Data Store 的 SP 文件夹中删除 SP。 [此更改导致 EF 模板生成器使 SP 调用成为可为空 INT 而不是单个 INT 结果的 ObjectResult。] 2) 使用“从数据库更新模型”将 SP 重新加载到 EDMX 3) 重建所有数据EDMX 所在的项目。 4) 退出 Visual Studio 并返回。 5) 重建整体解决方案。

    其他解决方法 - 来源:Microsoft 的 David Browne - 1) 重写 SP 创建一个 OUTPUT 参数并在那里返回结果。 2) 遇到错误时执行 THROW 或 RAISERROR。

    【讨论】:

    • EF6 错误!很好的解释。但是,如果您想返回行数,建议的修复程序难道不会起作用吗?如果要返回插入的行 ID,即 SCOPE_IDENTITY() 怎么办?
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多