我尝试调用一个接受表值参数的存储过程。我知道这在实体框架中还没有得到直接支持,但是据我所知,您可以使用 ObjectContext
的 ExecuteStoreQuery
命令来实现这一点。我有一个通用实体框架存储库,其中有以下 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
传递表值参数的方法?此外,我实际上是使用实体框架代码第一和强制转换的 DbContext
到 ObjectContext
,以获得 ExecuteStoreQuery
方法可用。这是必要的,或者我可以这样做对 DbContext
以及?