在 Entity Framework 中传递表值参数到存储过程
Entity Framework 本身并不原生支持直接向存储过程传递表值参数。然而,这可以通过使用 ObjectContext
的 ExecuteStoreQuery
命令来实现。
创建通用的仓储方法
首先,定义一个通用的仓储方法:
<code class="language-csharp">public IEnumerable<T> ExecuteStoredProcedure<T>(string procedureName, params object[] parameters) { // 构建命令字符串 StringBuilder command = new StringBuilder(); command.Append("EXEC "); command.Append(procedureName); command.Append(" "); // 添加参数占位符 for (int i = 0; i < parameters.Length; i++) { if (i > 0) command.Append(","); command.Append("{" + i + "}"); } // 执行查询 return this.context.ExecuteStoreQuery<T>(command.ToString(), parameters); }</code>
使用 ExecuteStoreQuery 和表值参数
当使用 ExecuteStoreQuery
和表值参数时,将 SqlParameter
的 SqlDbType
属性设置为 Structured
,并将 TypeName
属性设置为用户定义类型的名称:
<code class="language-csharp">var warnings = new SqlParameter("warnings", SqlDbType.Structured); warnings.Value = dt; warnings.TypeName = "dbo.udt_Warnings";</code>
向存储过程传递参数
在 ExecuteStoredProcedure
方法中,确保参数按照正确的顺序传递:
<code class="language-csharp">entities.ExecuteStoredProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);</code>
DbContext 与 ObjectContext
对于 Entity Framework Code First,需要将 DbContext
转换为 ObjectContext
才能使用 ExecuteStoreQuery
方法:
<code class="language-csharp">var entities = (ObjectContext)context; entities.ExecuteStoredProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);</code>
附加说明
ExecuteStoreCommand
的参数必须与存储过程中的顺序一致。以上是如何将表值参数传递给实体框架中的存储过程?的详细内容。更多信息请关注PHP中文网其他相关文章!