实体框架存储过程表值参数

我正在尝试调用一个接受表值参数的存储过程。我知道Entity Framework尚不直接支持此功能,但是据我了解,您可以使用的ExecuteStoreQuery命令来实现ObjectContext。我有一个通用实体框架存储库,其中有以下ExecuteStoredProcedure方法:


public IEnumerable<T> ExecuteStoredProcedure<T>(string procedureName, params object[] parameters)

{

    StringBuilder command = new StringBuilder();

    command.Append("EXEC ");

    command.Append(procedureName);

    command.Append(" ");


    // Add a placeholder for each parameter passed in

    for (int i = 0; i < parameters.Length; i++)

    {

        if (i > 0)

            command.Append(",");


        command.Append("{" + i + "}");

    }


    return this.context.ExecuteStoreQuery<T>(command.ToString(), parameters);

}

命令字符串最终如下所示:


EXEC someStoredProcedureName {0},{1},{2},{3},{4},{5},{6},{7}

我试图在接受表值参数的存储过程中运行此方法,但它会中断。我在这里读到,参数必须是类型SqlParameter,而表值参数需要将其SqlDbType设置为Structured。所以我这样做了,并得到一个错误说明:


The table type parameter p6 must have a valid type name

因此,我将SqlParameter.TypeName设置为在数据库上创建的用户定义类型的名称,然后在运行查询时收到以下真正有用的错误:


Incorrect syntax near '0'.

如果我恢复到ADO.NET并执行数据读取器,则可以使查询运行,但是我希望可以使用数据上下文使它正常工作。


有没有办法使用传递表值参数ExecuteStoreQuery?另外,我实际上使用的是Entity Framework Code First,并将强制转换DbContext为ObjectContext以获得ExecuteStoreQuery可用的方法。这是否有必要,或者我也可以针对DbContext?


桃花长相依
浏览 508回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP