Entity Framework 4 - 调用选择/分页存储过程

问题描述 投票:0回答:1

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

您可以将插入、更新和删除操作映射到存储过程,我已经这样做了。但是,为了使我的分页正常工作,我需要映射“选择”操作。

现在是我可以做到这一点的唯一/最好的方法,方法是转到我的模型浏览器,右键单击存储过程和“添加函数导入”并添加它。

这会产生以下代码......

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 中进行分页的示例都很棒!

stored-procedures pagination asp.net-mvc-2 entity-framework-4
1个回答
1
投票

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

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

一些建议:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.