雖然 Entity Framework 不直接支援傳遞表值參數,但可以使用 ObjectContext
的 ExecuteStoreQuery
指令實作變通方案。
自訂 EF 倉儲方法
以下泛型 EF 倉儲方法可讓您執行包含表值參數在內的預存程序:
<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>
自訂表值參數
如問題描述所述,表值參數需要特定的配置:
SqlParameter
型。 SqlDbType
必須設定為 Structured
。 TypeName
必須設定為使用者定義類型的名稱。 使用表值參數的 ExecuteStoreQuery
以下程式碼示範如何使用 ExecuteStoreQuery
傳遞表值參數:
<code class="language-csharp">dt.Rows.Add("EO01", 9, 4, 0); dt.Rows.Add("EO00", 9, 4, 0); dt.Rows.Add("EO02", 9, 4, 0); var warnings = new SqlParameter("warnings", SqlDbType.Structured); warnings.Value = dt; warnings.TypeName = "dbo.udt_Warnings"; entities.ExecuteStoredProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);</code>
ObjectContext 的預存程序執行擴充方法
或者,您可以為 ObjectContext
建立一個擴充方法:
<code class="language-csharp">public static void ExecuteStoredProcedure(this ObjectContext context, string storedProcName, params object[] parameters) { string command = "EXEC " + storedProcName + " @caseid, @userid, @warnings"; context.ExecuteStoreCommand(command, parameters); }</code>
此方法可讓您直接使用 ObjectContext
執行包含表值參數在內的預存程序。
Code First 相容性
如果使用 Entity Framework Code First,您可以將 DbContext
轉換為 ObjectContext
來存取 ExecuteStoreQuery
方法。但是,名為 EntityFrameworkExtras 的程式庫提供了一種更方便的方法來處理 Code First 環境中的表值參數。
以上是如何實作實體框架的預存程序表值參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!