我的要求是根据DB中表格中的值创建一个枚举。我正在使用ADO.NET实体框架模型(.edmx文件),任何人都可以帮助我。
答案 0 :(得分:10)
使用T4模板可能要容易得多。 Here is a really good article on getting started
下面的示例使用直接SQL连接,但正如您所看到的,您可以包含任何代码并将您喜欢的任何输出生成到编译到项目中的cs文件中。您可以使用通过Entituy Framework模型检索的对象集合上的枚举替换下面的ADO语法,并相应地输出。
在您希望生成枚举文件的目录中创建扩展名为.tt的文件。如果您将文件命名为XXXXX.tt,则会生成一个名为XXXXX.cs的文件,因此请正确命名该文件。
沿着这些方向尝试一些事情。您可能需要对语法和输出进行一些实验,但我不打算为您编写所有内容或者您不会学到任何东西:)
请注意,每次编辑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() #>
}
}
尝试改进这一点。而不是写入StringBuilder,将每个reader.Read()的结果直接输出到输出。此外,我已经包含了一个尚不存在的FixName方法,但您可能需要这样做以取出空格或非法字符。
答案 1 :(得分:7)
Daniel的模板很好,但是我已经为such a template付出了更多的努力,所以它完成了所有这些:
enum
不会被代码分析仔细检查; MultiWordValue
); 反正。 this blog post中记录了所有内容。