实体框架4 - 调用选择/分页存储过程

时间:2010-05-06 14:40:49

标签: stored-procedures asp.net-mvc-2 paging entity-framework-4

我刚刚开始使用Entity Framework 4.0和ASP.NET MVC 2,并且对存储过程和分页的使用有一些疑问。

您可以将插入,更新和删除操作映射到存储过程,我已经完成了此操作。但是,为了使我的分页工作,我需要映射Select操作。

现在是我可以通过访问我的模型浏览器,右键单击存储过程和“添加函数导入”并添加它来实现此目的的唯一/最佳方式。

这导致以下代码....

var contactFormSubmissions = _entities.ContactFormSubmission_GetContactFormSubmissions(1, 10);

我的问题是它将它添加到根级别的全局实体容器而不是ContactFormSubmission实体,如插入/更新和删除操作。

我宁愿这样,但是通过存储过程......

_entities.ContactFormSubmissions.Select<ContactFormSubmission>(string.Empty, pageParam, pageSizeParam);

这样选择的方式与其他操作的调用方式相同,并且我最终在实体容器的根目录中没有很多函数,这些函数可能无法管理。

这是一个较小的问题,因为至少它目前都在工作。

我的下一个问题是如何使用此功能最好地实现分页。

我见过的关于如何使用MVC和实体框架完成分页的所有示例都使用了LINQ和IQueryable。有没有办法使用IQueryable与延迟加载和LINQ函数Skip / Take与基于表的函数/ sproc?

http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/

PS - 使用SP的实体框架在MVC中进行分页的任何示例都会很棒!

1 个答案:

答案 0 :(得分:1)

开箱即用的LINQ不会包装存储过程。实体框架功能是通过EF调用存储过程并返回实体的唯一方法。这是可以理解的,因为EF已经知道知道什么参数来映射您的分页变量。

你会/不应该这样做,但我觉得有必要(因为没有什么是不可能的)说你可以为你的程序编写一个LINQ的自定义实现,但这将是一个干净地包装几个程序的工作。

一些建议:

  • 您可以使用linq并跳过存储过程
  • 如果你继续使用EF通过函数包装存储过程,你可以通过将模型分解成几个上下文来缓解许多功能问题
  • 您可以使用EF上下文的连接属性直接调用存储过程,并具有只读(非EF附加)viewmodel类以用于显示目的。 id(或其他主键)字段仍然是正确的值,可以让您进入详细屏幕或json回调以获得真实EF对象的可编辑版本

这些都不是完美的,但有很多方法可以解决这个问题。