Dot-Net

使用 ADO.NET 實體框架從表中存在的值生成列舉

  • May 10, 2013

我的要求是根據數據庫表中存在的值創建一個列舉。我正在使用 ADO.NET 實體框架模型(.edmx 文件),你們中的任何人都可以幫助我嗎?

使用 T4 模板可能要容易得多。這是一篇關於入門的非常好的文章

我下面的範例使用直接 SQL 連接,但正如您所見,您可以包含任何程式碼並將您喜歡的任何輸出生成到編譯到項目中的 cs 文件中。您可以將下面的 ADO 語法替換為對通過 Entituy Framework 模型檢索到的對象集合的列舉並相應地輸出。

在您希望生成列舉文件的目錄中創建一個副檔名為 .tt 的文件。如果您將文件命名為 XXXXX.tt,則會生成一個名為 XXXXX.cs 的文件,因此請適當地命名該 tt 文件。

沿著這些構想嘗試一些東西。您可能需要對語法和輸出進行一些試驗,但我不會為您編寫所有內容,否則您將學不到任何東西 :)

請注意,每次編輯 tt 文件時都會呼叫此數據庫。

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Data" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#
   SqlConnection sqlConn = new SqlConnection(@"Data Source=XXXX;Initial Catalog=XXXX; Integrated Security=True");
   sqlConn.Open();
#>
namespace AppropriateNamespace
{
public enum YourEnumName
{
   <#
   string sql = string.Format("SELECT Id, Name FROM YourTable ORDER BY Id");
   SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
   IDataReader reader = sqlComm.ExecuteReader();

   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   while (reader.Read())
   {
       sb.Append(FixName(reader["Name"].ToString()) + " = " + reader["Id"] + "," + Environment.NewLine + "\t\t");
   }
   reader.Close();
   sqlComm.Dispose();
   #>
<#= sb.ToString() #>
   }
}

嘗試改進這一點。將每個 reader.Read() 的結果直接輸出到輸出,而不是寫入 StringBuilder。此外,我還包含了一個尚不存在的 FixName 方法,但您可能需要它來刪除空格或非法字元。

引用自:https://stackoverflow.com/questions/2636193