Entity Framework 預存程序表值參數
Entity Framework 本身並不會直接支援傳遞資料表值參數給預存程序。但是,可以使用 ObjectContext
的 ExecuteStoreQuery
方法來實現變通方案。
以上程式碼中,儲存庫中存在一個通用的 ExecuteStoredProcedure
方法:
<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>
使用此方法傳遞表值參數時,可能會出現錯誤,例如「表格類型參數 p6 必須具有有效的類型名稱」。若要解決此問題,必須將 SqlDbType
指定為 Structured
,並將 SqlParameter.TypeName
設定為資料庫中使用者定義類型 (UDT) 的名稱。
但是,即使進行了這些修改,您仍然可能會遇到與無效語法相關的錯誤。
自訂擴充方法
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>
此擴充方法可讓您直接使用表值參數呼叫預存程序。範例用法如下:
<code class="language-csharp">var entities = new NewBusinessEntities(); var dt = new DataTable(); dt.Columns.Add("WarningCode"); dt.Columns.Add("StatusID"); dt.Columns.Add("DecisionID"); dt.Columns.Add("Criticality"); dt.Rows.Add("EO01", 9, 4, 0); dt.Rows.Add("EO00", 9, 4, 0); dt.Rows.Add("EO02", 9, 4, 0); var caseId = new SqlParameter("caseid", SqlDbType.Int); caseId.Value = 1; var userId = new SqlParameter("userid", SqlDbType.UniqueIdentifier); userId.Value = Guid.Parse("846454D9-DE72-4EF4-ABE2-16EC3710EA0F"); var warnings = new SqlParameter("warnings", SqlDbType.Structured); warnings.Value = dt; warnings.TypeName = "dbo.udt_Warnings"; entities.ExecuteStoredProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);</code>
限制條件
使用此擴充方法或類似的自訂方法時,請考慮以下限制:
以上是如何將表值參數傳遞給實體框架中的預存程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!