实体框架(数据库第一)具有从存储过程

问题描述:

环境不正确的返回结果:实体框架(数据库第一)具有从存储过程

  • 的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因为它错误地调用了错误的ObjectContext.ExecuteFunction(可在模板生成的类YourDatabaseEntities中找到,它是DBContext的子节点),因此返回包含行计数而不是返回值的INT。

为什么错了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命令作为最后一条语句。

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

其他解决方法 - 来源:Microsoft的戴维·布朗 - 1)改写SP创建输出参数和返回的结果存在。 2)发生错误时执行THROW或RAISERROR。