entity framework(数据库优先)具有不正确的存储过程返回结果

环境:

  • 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_Apply在存储过程结束时使用RETURN命令设置返回值。

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

 var spResults = context.DOIOwnerChanges_Apply(...) 

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

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

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

为什么问题2是8 :SP返回8行数据而不是返回值,因为Microsoft使用了错误的ExecuteFunction。

SP修复问题1 – 您必须注释掉SET NOCOUNT ON。

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

解决方法FIX – 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。