Entity Framework 4 - Вызов хранимой процедуры выбора / разбиения по страницам

Я только начинаю работать с Entity Framework 4.0 и ASP.NET MVC 2, и у меня есть несколько вопросов относительно использования хранимых процедур и разбиения на страницы.

Вы можете сопоставить действия Insert, Update и Delete с хранимыми процедурами, и я уже сделал это. Однако для того, чтобы моя разбивка на страницы работала, мне нужно сопоставить действие Выбрать.

Теперь это единственный / лучший способ сделать это, зайдя в браузер моей модели, щелкнув правой кнопкой мыши по хранимой процедуре и «Добавить функцию импорта» и добавив ее.

Это приводит к следующему коду ....

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

Моя проблема в том, что он добавляет его в глобальный контейнер сущностей на корневом уровне, а не в сущность ContactFormSubmission, такую ​​как действия Insert / Update и Delete.

Я бы предпочел что-то подобное, но через хранимую процедуру ...

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

Таким образом, выбор вызывается так же, как и другие действия, и я не получаю много функций в корне контейнера сущностей, которые могут стать неуправляемыми.

Это меньшая проблема, поскольку, по крайней мере, все это работает в настоящее время.

Мой следующий вопрос: как лучше всего реализовать разбиение по страницам с помощью этой функции.

Все примеры, которые я видел, о том, как выполнить разбиение по страницам с помощью MVC и Entity Framework, использовали LINQ и IQueryable. Есть ли способ использовать IQueryable с отложенной загрузкой и функции LINQ Skip / Take с табличной функцией / sproc?

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

PS - любые примеры разбиения на страницы в MVC с Entity Framework с использованием SP были бы замечательными!


person CountZero    schedule 06.05.2010    source источник


Ответы (1)


LINQ из коробки не переносит хранимую процедуру. Функции Entity Framework - единственный способ вызвать хранимые процедуры через EF и вернуть объект. Это понятно, поскольку EF знает, какой параметр нужно сопоставить с вашими переменными подкачки.

Вы бы никогда этого не делали, но я чувствую себя обязанным (поскольку нет ничего невозможного) сказать, что вы могли бы написать собственную реализацию LINQ для своих процедур, но это будет огромная работа, чтобы аккуратно обернуть пару процедур.

Некоторые предложения:

  • Вы можете просто использовать linq и пропустить хранимую процедуру
  • Если вы останетесь с EF, обертывающим хранимую процедуру через функцию, вы можете облегчить проблему множества функций, разбив модель на несколько контекстов.
  • Вы можете использовать свойство соединения контекста EF для непосредственного вызова хранимой процедуры и иметь доступный только для чтения (без присоединения EF) класс модели представления для использования в целях отображения. Поле id (или другой первичный ключ) по-прежнему будет правильным значением, чтобы перейти к подробному экрану или обратному вызову json, чтобы получить редактируемую версию реального объекта EF.

Ни один из них не идеален, но есть множество способов справиться с этим.

person Tim Hoolihan    schedule 11.07.2011