对于简单的sproc,“选定的存储过程或函数不返回任何列”

时间:2013-05-28 22:40:36

标签: .net entity-framework visual-studio-2012 entity-framework-5 sql-server-2012

我已经阅读了很多关于如何处理这个问题的帖子。这些都不起作用。这是我的情景:

我有以下的sproc(完全如脚本,除了我更改了模式,表和列名称以去除它):

USE [DevelopmentDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE [MyCustomSchema].[GetSomethingINeed]
AS
BEGIN
    SELECT  things.ThingGroupId
    FROM    ReferenceSchema.SomethingNeeded things (NOLOCK)            
    WHERE   things.ThingId = 4655946989

END

GO

当我将其导入实体框架时,似乎工作正常。但是当我点击“获取列信息”按钮时,我收到此消息:

  

选定的存储过程或函数不返回任何列。

我试过了:

  • SET FMTONLY OFF
  • SET NOCOUNT OFF
  • 将sproc移至dbo架构
  • 使用sproc(SELECT cast (1 AS int) as SomeColumn
  • 更简单
  • 删除并重新添加sproc(通过模型浏览器)
  • 重新启动Visual Studio。

这可能是SQL Server 2012问题吗?

3 个答案:

答案 0 :(得分:2)

将其更改为更像这样......

SELECT  SomethingNeeded.ThingGroupId
FROM    ReferenceSchema.SomethingNeeded 
WHERE   SomethingNeeded.ThingId = 4655946989

EF不了解您的别名。

绝对没有理由(NOLOCK)

另外,请确保该表存在。

答案 1 :(得分:2)

我明白了。我在app.config中的连接字符串设置为使用SQL用户。

该用户的权限有限。当我将其更改为使用集成安全性时,一切正常。

如果实体框架让我知道它失败了会很好,但现在我知道并确保我拥有正确的权限......

答案 2 :(得分:1)

我遇到了同样的问题,并没有在这里和其他地方提到的解决方案中找到解决方案。 但是,手动添加复杂类型并将其设置为该过程的函数导入的结果总是有效。这是5分钟的工作,唯一的条件是属性必须按类型和名称匹配过程返回的列。您可以从模型浏览器中执行此操作,或者手动编辑edmx文件。