实体框架不会显示存储过程

时间:2013-07-11 15:55:02

标签: asp.net entity-framework stored-procedures

我整个上午一直在弄乱这个,但我找不到答案。我正在尝试使用EF来引用存储过程,但无论我尝试什么,我都无法在模型浏览器中显示它。

我已经使用以下步骤尝试将程序转换为模态:

  1. 向实体模型添加程序

  2. 右键单击模型并选择添加新 - >功能导入

  3. 给它起个名字并选择我的程序

  4. 生成一个新的复杂集合(我也尝试过使用实体,但都没有工作)

  5. 点击确定

  6. 我已经多次这样做了,我可以在模型中的“函数Imports”文件夹中看到该函数,但它从未出现在模型中,因此我无法引用它。

    我发现我可以通过执行以下操作直接引用存储过程(不带导入):

        DBEntities db = new DBEntities();
        var test = db.gsp_GetGroups();
    

    但是,如果没有大的解决方法,我无法将其转换为IQueryable<T>

    是否有人知道我缺少哪些步骤才能正确添加?

    由于

    P.S。 VS 2012,asp.net 4.0

5 个答案:

答案 0 :(得分:9)

验证您用于生成EF模型的SQL登录是否有权执行您尝试导入的存储过程。

  1. 转到App.config并查找connectionStrings条目(通常位于底部)。如果您有多个连接字符串,那么您想要的是您的上下文使用的字符串。
    • 转到您的edmx文件并深入查找实体类。
    • 例如,如果您有MyDbModel.edmx,那么您将拥有MyDbModel.Context.tt,而MyDbModel.Context.cs将包含MyDbModel.Context.cs
    • DbContext文件中,您将拥有一个继承自base("name=<your connection string name>")的类,构造函数将调用<your connection string name>
    • {{1}}是您在app.config中寻找的那个。
  2. 您的连接字符串显示用户(集成安全性将表示已登录的AD用户。这仅在使用您的程序的每个人都具有正确的数据库访问权限时才有效。在生产环境中这可能是一个冒险的假设)
  3. 转到SQL Management Studio并将此存储过程添加到用户的“Securables”

答案 1 :(得分:6)

转到Sql Server Management Studio中的SP,右键单击属性,转到权限将public设置为Execute。

以上都可能是权限问题的答案,上面的答案让我看看为什么并得出结论。

答案 2 :(得分:3)

这可能是因为实体框架使用无权执行存储过程的用户标识登录数据库。

要找出:

在.NET项目的app.config或web.config文件中,检查哪个user id正在访问数据库。您会在connectionString之后的user id=之后看到它。

如果它与您用于编写存储过程的用户标识(即在SQL中)不同,请与您的数据库管理员联系,以查看您的.NET(以及随后的实体框架)中的用户标识是否具有执行权限存储过程。

答案 3 :(得分:1)

@Limey您的问题可能是由导入功能的Access级别引起的。试试这个:

Model Browser中找到文件夹Function Inports。现在右键单击您的函数并选择Properties。在属性窗口中,第一个选项应为Access,将其更改为Public并保存您的model.edmx。

返回您的代码,看看是否有效。

答案 4 :(得分:1)

我遇到了类似的问题,从实体框架5升级到6工作是为了解决这个问题。

对我来说,它没有在存储过程下显示我的自定义sql server架构,尽管它在表部分中正确显示了相同的架构。

希望这有助于其他人。