C# 实体框架(数据库优先)从存储过程返回的结果不正确

C# 实体框架(数据库优先)从存储过程返回的结果不正确,c#,sql-server,entity-framework,stored-procedures,entity-framework-6,C#,Sql Server,Entity Framework,Stored Procedures,Entity Framework 6,环境: Visual Studio 2017 SQL Server 2016 EFV6采用数据库优先的方法 背景:存储过程位于EDMX中。“我的存储过程”将返回值设置为0(如果未发生任何事件),1(如果有影响)和@@ERROR(如果有错误)的值 后台1:我的存储过程,LTM\u Lease\u DeleteSubFiles,在存储过程的顶部设置NOCOUNT ON,并在存储过程的末尾使用return命令设置返回值 问题1:我的调用返回-1,它甚至不在存储过程中: var spResults

环境:

  • Visual Studio 2017
  • SQL Server 2016
  • EFV6采用数据库优先的方法
背景:存储过程位于EDMX中。“我的存储过程”将返回值设置为0(如果未发生任何事件),1(如果有影响)和@@ERROR(如果有错误)的值

后台1:我的存储过程,
LTM\u Lease\u DeleteSubFiles
,在存储过程的顶部设置NOCOUNT ON,并在存储过程的末尾使用
return
命令设置返回值

问题1:我的调用返回-1,它甚至不在存储过程中:

var spResults = context.LTM_Lease_DeleteSubFiles(...)
var spResults = context.DOIOwnerChanges_Apply(...)
后台2:我的存储过程
DOIOwnerChanges\u Apply
在存储过程末尾使用
return
命令设置返回值

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

var spResults = context.LTM_Lease_DeleteSubFiles(...)
var spResults = context.DOIOwnerChanges_Apply(...)

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

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

为什么问题1是-1:我相信设置NOCOUNT ON会导致SP返回no count结果,而Microsoft的ExecuteFunction会将该结果作为错误代码返回

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

SP对问题1的修复-您必须对设置为NOCOUNT的内容进行注释

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

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


其他解决方法-来源:Microsoft的David Browne-1)重写SP,创建输出参数并返回结果。2) 当出现错误时,执行抛出或抛出错误。

EF6错误!很好的解释。但是,如果您想返回行数,那么建议的修复是否只起作用?如果要返回插入的行ID,即SCOPE_IDENTITY(),该怎么办?