我整个上午一直在搞乱这个,但我找不到答案 . 我试图使用EF来引用存储过程,但无论我尝试什么,我都无法在模型浏览器中显示它 .
我已经使用以下步骤尝试将过程放入模态中:
-
向实体模型添加过程
-
右键单击模型并选择添加新 - >功能导入
-
给它起个名字并选择我的程序
-
生成一个新的复杂集合(我也试过使用一个实体,既不工作)
-
单击“确定”
我已经多次这样做了,我可以在模型中的“函数Imports”文件夹中看到该函数,但它从未出现在模型中,所以我无法引用它 .
我发现我可以通过执行以下操作直接引用存储过程(不带导入):
DBEntities db = new DBEntities();
var test = db.gsp_GetGroups();
但是,如果没有大的解决方法,我无法将其转换为 IQueryable<T>
.
有没有人知道我缺少哪些步骤才能正确添加?
谢谢
附: VS 2012,asp.net 4.0
5 回答
验证您用于生成EF模型的SQL登录是否有权执行您尝试导入的存储过程 .
转到App.config并查找
connectionStrings
条目(通常在底部) . 如果您有多个连接字符串,那么您想要的是您的上下文使用的字符串 .转到edmx文件并深入查找实体类 .
例如,如果您有
MyDbModel.edmx
,那么您将拥有MyDbModel.Context.tt
,而MyDbModel.Context.tt
将包含MyDbModel.Context.cs
.在
MyDbModel.Context.cs
文件中,您将拥有一个继承自DbContext
的类,构造函数将调用base("name=<your connection string name>")
<your connection string name>
是您在app.config中寻找的那个 .您的连接字符串显示用户(集成安全性将表示已登录的AD用户 . 这仅在使用您的程序的每个人都具有正确的数据库访问权限时才有效 . 这在 生产环境 环境中可能是一个冒险的假设)
转到SQL Management Studio并将此存储过程添加到用户的"Securables"
转到Sql Server Management Studio中的SP,右键单击属性,转到权限Set public to Execute .
以上都可能是权限问题的答案,上面的答案让我看看为什么并得出结论 .
这可能是因为实体框架使用无权执行存储过程的用户标识登录到数据库 .
要找出:
在.NET项目的app.config或web.config文件中,检查哪些
user id
正在访问数据库 . 你会在connectionString
之后的connectionString
之后看到它 .如果它与您用于编写存储过程的用户标识(即在SQL中)不同,请与您的数据库管理员联系,以查看.NET(以及随后的实体框架)中的用户标识是否具有执行存储过程的权限 .
@Limey您的问题可能是由导入功能的
Access
级别引起的 . 试试这个:在
Model Browser
找到文件夹Function Inports
. 现在右键单击您的函数并选择Properties
. 在属性窗口中,第一个选项应该是Access
将其更改为Public
并保存您的model.edmx .返回代码,看看是否有效 .
我有一个类似的问题,从实体框架5升级到6工作来解决这个问题 .
对我来说,它没有在存储过程下显示我的自定义sql server架构,尽管它在表部分中正确显示了相同的架构 .
希望这有助于其他人 .