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

Lim*_*mey 8 asp.net stored-procedures entity-framework

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

我已经使用以下步骤尝试将过程放入模态中:

  1. 将过程添加到实体模型

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

  3. 给它一个名字,然后选择我的程序

  4. 生成一个新的复杂集合(我也试过使用一个实体,既不工作)

  5. 单击确定

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

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

    DBEntities db = new DBEntities();
    var test = db.gsp_GetGroups();
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

PS VS 2012,asp.net 4.0

Dav*_*vid 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> 是你在app.config中寻找的那个.
  2. 您的连接字符串显示用户(集成安全性将表示已登录的AD用户.这仅在使用您的程序的每个人都具有正确的数据库访问权限时才有效.在生产环境中这可能是一个冒险的假设)
  3. 转到SQL Management Studio并将此存储过程添加到用户的"Securables"


Mar*_*owe 7

转到Sql Server Management Studio中的SP,右键单击属性,转到权限Set public to Execute.

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


Dav*_*gel 6

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

要了解:

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

如果它与您用于编写存储过程(即在 SQL 中)的用户 ID 不同,请与您的数据库管理员核对以查看您的 .NET(以及因此 Entity Framework)中的该用户 ID 是否有权执行存储过程。


Jon*_*zzi 1

@Limey你的问题可能是由Access你的导入函数的级别引起的。尝试这个:

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

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