Я просмотрел несколько презентаций EF Code First и не видел, как EFCF работает с хранимыми процедурами.
Как я могу объявить метод, который будет использовать некоторый sp? Могу ли я передать сущность методу, вызывающему sp, без ручного сопоставления свойств сущности с параметрами sp?
А что будет, если я поменяю модель? Будет ли он уронить мой sp при воссоздании таблицы из модели? А что насчет триггеров?
Если эти вещи не поддерживаются, есть ли планы по их поддержке в будущем?
Ответы:
РЕДАКТИРОВАТЬ: мой исходный ответ для EF4.1 (ниже) устарел. См. Ответ ниже от Диего Веги (который работает в команде EF в Microsoft)!
@gsharp и Шон Маклин: Откуда вы берете эту информацию? Разве у вас все еще нет доступа к базовому ObjectContext?
Замените оператор «select» на сохраненную процедуру, и готово.
Что касается вашего другого вопроса: да, к сожалению, ваш SP будет сбит. Возможно, вам потребуется добавить в код операторы CREATE PROCEDURE.
Для EF 4.2:
источник
Обновление: начиная с EF6, EF Code First поддерживает сопоставление хранимых процедур для вставки, обновления и удаления. Вы можете указать отображение хранимых процедур во время создания модели с помощью метода MapToStoredProcedures. Мы также поддерживаем автоматическое формирование базовых хранимых процедур для этих операций. См. Спецификацию функции здесь .
Оригинальный ответ: нас не будет поддержки сопоставления хранимых процедур в модели в Code-First в первом выпуске, а также у нас не будет способа автоматически генерировать хранимые процедуры для операций CRUD из ваших типов. Это функции, которые мы хотели бы добавить в будущем.
Как упоминалось в этом потоке, можно вернуться к ObjectContext, но DbContext также предоставляет удобные API-интерфейсы для выполнения собственных запросов и команд SQL (например, DbSet.SqlQuery, DbContext.Database.SqlQuery и DbContext.Database.ExecuteSqlCommand). Различные версии SqlQuery имеют те же базовые функции материализации, которые существуют в EF4 (например, ExecuteStoreQuery: http://msdn.microsoft.com/en-us/library/dd487208.aspx ).
Надеюсь это поможет.
источник
источник
Более безопасным решением будет следующее:
http://strugglesofacoder.blogspot.be/2012/03/calling-stored-procedure-with-entity.html
Использование этого класса:
источник
Для .NET Core (EntityFrameworkCore) мне удалось заставить их работать.
Может быть, не самый изящный, но это определенно работает.
Миграция для добавления хранимой процедуры выглядит как это :
Затем я мог бы вызвать его с помощью следующего кода:
Позже попытались получить некоторые из связанных данных (данные о взаимоотношениях «один ко многим», например, содержимое сообщения), и блог вернулся с заполненным содержимым сообщения, как указано.
источник