我整个上午一直在弄乱这个,但我找不到答案。我正在尝试使用EF来引用存储过程,但无论我尝试什么,我都无法在模型浏览器中显示它。
我已经使用以下步骤尝试将程序转换为模态:
向实体模型添加程序
右键单击模型并选择添加新 - >功能导入
给它起个名字并选择我的程序
生成一个新的复杂集合(我也尝试过使用实体,但都没有工作)
点击确定
我已经多次这样做了,我可以在模型中的“函数Imports”文件夹中看到该函数,但它从未出现在模型中,因此我无法引用它。
我发现我可以通过执行以下操作直接引用存储过程(不带导入):
DBEntities db = new DBEntities();
var test = db.gsp_GetGroups();
但是,如果没有大的解决方法,我无法将其转换为IQueryable<T>
。
是否有人知道我缺少哪些步骤才能正确添加?
由于
P.S。 VS 2012,asp.net 4.0
答案 0 :(得分:9)
验证您用于生成EF模型的SQL登录是否有权执行您尝试导入的存储过程。
connectionStrings
条目(通常位于底部)。如果您有多个连接字符串,那么您想要的是您的上下文使用的字符串。
MyDbModel.edmx
,那么您将拥有MyDbModel.Context.tt
,而MyDbModel.Context.cs
将包含MyDbModel.Context.cs
。DbContext
文件中,您将拥有一个继承自base("name=<your connection string name>")
的类,构造函数将调用<your connection string name>
答案 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架构,尽管它在表部分中正确显示了相同的架构。
希望这有助于其他人。