Вопрос по entity-framework – выполнить сохраненный процесс в ExecuteStoreQuery EF. это ошибка в EF?

4

пытаясь выполнить хранимый процесс в EF, используя следующий код:

<code>var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("GetByName", params);
</code>

но продолжайте получать эту ошибку:

Procedure or function 'GetByName' expects parameter '@FirstName', which was not supplied.

а из sql profiler:

<code>exec sp_executesql N'GetByName',N'@FirstName nvarchar(100),@FirstName=N'Bob'
</code>

что не так с приведенным выше кодом ExecuteStoreQuery?

Ваш Ответ

3   ответа
0

что я сделал, чтобы использовать SP в EF, если у вас есть несколько параметров: -

        public virtual ObjectResult<GetEpisodeCountByPracticeId_Result> GetEpisodeCountByPracticeId(Nullable<int> practiceId, Nullable<System.DateTime> dat1)
    {

        SqlParameter practiceIdParameter = practiceId.HasValue ?
            new SqlParameter() { ParameterName = "practiceId", Value = practiceId, SqlDbType = SqlDbType.Int } :
            new SqlParameter() { ParameterName = "practiceId", SqlDbType = SqlDbType.Int }; 

        SqlParameter dat1Parameter = dat1.HasValue ?
            new SqlParameter() { ParameterName = "dat1", Value = dat1, SqlDbType = SqlDbType.DateTime }:
            new SqlParameter() { ParameterName = "dat1", SqlDbType = SqlDbType.DateTime }; 


        return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<GetEpisodeCountByPracticeId_Result>("exec GetEpisodeCountByPracticeId @practiceId, @dat1", practiceIdParameter, dat1Parameter);
    }

Если вы не добавляете параметры (например, @practiceId) в свойство commandText, вы получите сообщение об ошибке.

10

params это зарезервированное слово ...

Думаю, ваш запрос должен быть:

var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("exec GetByName @FirstName", params);

Следует также сказать, что если этот процесс является стандартной частью вашей базы данных и модели данных, то вам следуетимпортировать его в свой EDM так что он доступен непосредственно в вашем контексте.

спасибо, приятель ... слово "exec" необязательно. протестировано с возвращением this._repositoryContext.ObjectContext.ExecuteStoreQuery & lt; ResultType & gt; (& quot; GetByName @ FirstName & quot ;, params) и работает нормально! user384080
Как я могу добиться этого с помощью метода ExecuteStoreQuery? я не имею никакого контроля над тем, что SQL-оператор будет сгенерирован. это полностью зависит от метода ExecuteStoreQuery. user384080
Извините, уточнил мой ответ.
2

которая больше подходит для & quot; ad-hoc & quot; запросы.

var parameters = new ObjectParameter[] {new ObjectParameter("FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteFunction<ResultType>("GetByName", parameters);

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

попробовал это уже, но не повезло user384080

Похожие вопросы