Entity Framework и хранимые процедуры - PullRequest
4 голосов
/ 05 ноября 2010

Я заметил в конструкторе Entity Framework, что вы можете отобразить хранимые процедуры для операций вставки, обновления и удаления.Есть ли способ сделать это и для операций выбора, или есть новое направление для кода доступа к базе данных, где мы больше не пишем хранимые процедуры для наших основных операций выбора?

Компания, в которой я работаюfor довольно непреклонно всегда использует хранимые процедуры для каждой операции базы данных, хотя Entity Framework делает вызовы безопасными, вызывая sp_executesql.

Кажется, что и LINQ to SQL, и Entity Framework отказались от использования хранимых процедурдля выбора данных.Это точное утверждение?

Просто чтобы прояснить мой вопрос:

В моей базе данных есть таблица с именем Product.Я использую мастер в Entity Framework для генерации своих моделей ... поэтому у меня теперь есть Entity под названием Product.Когда я делаю следующий запрос:

db.Products.SingleOrDefault(p => p.Id == 1);

Он генерирует код, похожий на:

EXEC sp_executesql N'SELECT * FROM Product'

Когда я действительно хочу сделать что-то вроде:

EXEC up_GetProduct @Id = 1

Еслиэто не возможно сделать с помощью SingleOrDefault, я в порядке с этим.Я бы предпочел иметь следующее:

db.Products.GetProduct(1);

Это обычно выполняется, или большинство людей просто динамически генерируют SQL?

Ответы [ 2 ]

7 голосов
/ 05 ноября 2010

Сами сущности не разрешают хранимые процедуры для выбора. Есть несколько причин. С макушки головы:

  1. Как бы вы добавили предложение where к вашей хранимой процедуре? Вам придется либо делать это с помощью LINQ to Objects и иметь неэффективный запрос, либо каким-либо образом добавлять пользовательское сопоставление в свойства хранимой процедуры. Хотя это и не невозможно, но определенно вносит некоторую сложность реализации.
  2. Сущности могут иметь отношения, которые используются для соединения в запросах. С хранимыми процедурами у вас снова похожая проблема. Если у вас есть таблицы Order и OrderItem, как вы присоединитесь? Вы либо запускаете SelectOrder, и для каждого заказа запускаете SelectOrderItem (1 + n запросов), либо имеете одну хранимую процедуру, которая возвращает обе, либо как один набор результатов с дублированными данными Order, либо как два набора результатов. Затем вы должны указать, как это отображается на объекты. Если вам нужно вручную указать сопоставление, оно отрицает назначение отношений сущностей, которые вы должны были установить.
  3. Как вы делаете пейджинг? С LINQ to Entities вы можете предоставить IQueryable бизнес-уровню или уровню пользовательского интерфейса (на ваше усмотрение). Затем вы выполняете фильтрацию LINQ, которая модифицирует SQL и делает его эффективным. С помощью хранимых процедур вам снова придется каким-то образом вручную определять все это или выполнять фильтрацию с помощью LINQ для объектов.
  4. LINQ позволяет вам select new { o.Column1, o.Column2 }. Это генерирует SQL, который выбирает только те 2 столбца, которые вам нужны. Очень полезно, если у вас есть BLOB / VARCHAR(MAX). С помощью хранимых процедур вы обычно возвращаете каждый столбец (расточительный во многих отношениях). Вы МОЖЕТЕ разбить хранимые процедуры на GetOrderDetailMain и GetOrderDetailImages (или аналогичные), но невозможно создать каждую комбинацию.

По моему мнению, если вы будете использовать EF-фреймворк, пусть он сделает CRUD для вас. Используйте хранимые процедуры для сложной логики, такой как полнотекстовый поиск, определенный запрос, который выполняется слишком медленно и т. Д. В противном случае вы не получите от этого большой пользы.

Редактировать : Конечно, есть преимущества для хранимых процедур. Они подготовлены / предварительно скомпилированы, четко определены как «API базы данных», вам не нужно предоставлять доступ к таблицам (хотя с помощью SP CRUD вы можете делать то же самое), легче отлаживать / настраивать запросы, легче знать , который запрашивает для настройки, может выполнять пакетную обработку и т. Д. Однако для простого CRUD вы должны спросить себя, стоит ли время для реализации / управления накладными расходами хранимых процедур.

2 голосов
/ 05 ноября 2010

Вы, безусловно, можете использовать хранимые процедуры для выбора в Entity Framework. Я имел большой успех с функциями импорта , сложных типов и хранимыми процедурами с EF4. И их тоже не сложно настроить.

Я предупрежу вас об одном: если вы используете SQL Server 2005, вам, возможно, придется перекомпилировать любую хранимую процедуру, которую вы хотите использовать с SET FMTONLY OFF, если вы хотите, чтобы средство моделирования сущностей генерировало для вас сложный тип , См. этот вопрос для более подробной информации.

См. Быстрый старт для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...