2013-07-11 34 views
5

我一直在搞乱这一切上午,但我无法找到答案。我试图用EF引用一个存储过程,但无论我怎么努力,我不能让它在模型浏览器中显示。实体框架将不会显示存储过程

我已经使用以下步骤来尝试让程序进入模式:

  1. 插件程序,实体模型

  2. 右键单击模型,选择Add New - >功能导入

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

  4. 生成一个新的复杂的集合(我也曾尝试使用实体,无论是工作)

  5. 单击确定

我已经这样做了很多次,我可以看到在模型中的“功能导入”文件夹的功能,但它从来没有出现在模型中,所以我不能参考它。

我发现我可以通过以下操作直接引用存储过程(不包括进口):

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

但是,我不能这样没有大的解决方法转换为IQueryable<T>

是否有人知道什么步骤我失踪得到这个适当加?

谢谢

P.S. VS 2012,asp.net 4.0

+0

我有同样的问题,你有没有想过问题是什么? – Michiel

+0

对于我的项目,我最终没有使用EF来存储特效,但我确实记得与另一个开发人员讨论了这个问题,并且我记得他说这是proc没有与之关联的任何模型的问题。我会尽力狩猎他并问他。 – Limey

+0

FWIW,存储的proc结果无法通过服务器端的IQueryable进一步扩展。如果您希望将其他查询功能传递给数据集,则可能需要使用表值函数导入。 –

回答

1

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

Model Browser找到该文件夹​​Function Inports。现在右键单击您的功能并选择Properties。在属性窗口的第一个选项应该是Access改变它Public并保存model.edmx。

回到你的代码,看看这项工作。

+0

对不起,但那不是。访问权限已被设置为公开。 – Limey

7

验证SQL登录您使用生成您的EF模型有权限执行您要导入存储的特效。

  1. 转到您的App.config并查找connectionStrings条目(通常位于底部)。如果你有超过1个连接字符串,你想要的就是你的上下文使用的那个。
    • 转到您的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用户。这如果大家谁使用你的程序将有正确的DB访问只会工作,这可以在一个危险的假设生产环境)
  3. 转到SQL Management Studio中,该存储过程添加到用户的“安全对象”
+0

这解决了我的问题。 – pixelmeow

+0

正如我在Mark的回答中评论的那样,如果你能帮到的话,不要给每个人都执行权限。通过将数据库限制为特定的登录名来保证数据库的安全;在这种情况下,您分配给EF模型的人。 – David

+0

这工作!谢谢 –

1

这可能是因为实体框架是签署该数据库不具有权限的用户ID执行存储过程。

要了解:

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

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

+0

ID可以完全访问数据库。 – Limey

1

我有一个类似的问题,从实体框架5升级到6为我解决问题。

对我来说,它并没有在存储过程下显示我的自定义sql服务器模式,尽管它在表格部分正确显示了相同的模式。

希望这可以帮助别人。

6

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

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

+1

注意这一点 - 授予执行公共可能是一个安全漏洞。最好只对其需要访问的SP授予特定的登录权限,并将其留在那里。 – David

+1

呼叫良好+1。尽管这指向了权限问题。 –

+1

好的地方,请确保您授予EXECUTE到正确的用户/组和存储过程。在我的情况下,我从另一个sp复制了EXECUTE权限,并没有改变它 – kolin