代码之家  ›  专栏  ›  技术社区  ›  CountZero

实体框架4-调用select/paging存储过程

  •  2
  • CountZero  · 技术社区  · 15 年前

    我刚从Entity Framework 4.0和ASP.NET MVC 2开始,对存储过程的使用和分页有几个问题。

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

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

    这将导致以下代码….

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

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

    我希望这样,但通过存储过程…

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

    这样,select的调用方式与其他操作的调用方式相同,并且我不会在实体容器的根目录中有很多函数,而这些函数可能会变得不可维护。

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

    我的下一个问题是如何使用这个函数最好地实现分页。

    我所看到的关于如何使用MVC完成分页的所有示例和实体框架都使用了Linq和iQueryable。有没有一种使用iqueryable进行延迟加载的方法,以及使用基于表的函数/存储过程的linq函数skip/take?

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

    ps-任何使用sp的实体框架在MVC中分页的例子都是很好的!

    1 回复  |  直到 8 年前
        1
  •  1
  •   marc_s    8 年前

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

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

    一些建议:

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

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