在ExecuteStoreQuery EF中执行存储过程。这是EF中的一个错误吗?

时间:2012-04-23 23:20:11

标签: entity-framework

尝试使用以下代码在EF中执行存储过程:

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

但不断收到此错误:

  

过程或函数'GetByName'需要参数'@FirstName',   没有提供。

和sql profiler:

exec sp_executesql N'GetByName',N'@FirstName nvarchar(100),@FirstName=N'Bob'

上面的ExecuteStoreQuery代码有什么问题?

3 个答案:

答案 0 :(得分:10)

忽略params是保留字的事实......

认为您的查询需要:

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

还应该说,如果该proc是数据库和数据模型的标准部分,那么您应该import it into your EDM,因此它可以直接在您的上下文中使用。

答案 1 :(得分:2)

使用ExecuteFunction而不是更适合“ad-hoc”查询的ExecuteStoreQuery。

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

存储过程也可以在上下文中映射为函数,因此可以用作类型化方法。看看Using stored procedures with Entity Framework

答案 2 :(得分:0)

如果你有多个参数,这就是我在EF中使用SP的方法: -

        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);
    }

如果您不在commandText属性中添加参数(例如@practiceId),则会收到您收到的错误