使用ADO.NET Entity框架从表中的值生成枚举

时间:2010-04-14 09:17:37

标签: .net entity-framework ado.net enums t4

我的要求是根据DB中表格中的值创建一个枚举。我正在使用ADO.NET实体框架模型(.edmx文件),任何人都可以帮助我。

2 个答案:

答案 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付出了更多的努力,所以它完成了所有这些:

  • 使用显式整数值生成枚举值;
  • 使用Visual Studio的命名空间命名约定,因此生成的枚举具有项目的默认命名空间,并附加了任何子文件夹(就像Visual Studio中的任何代码文件一样);
  • 使用其他描述表列值添加完整的枚举XML文档;如果你没有这些没关系;
  • 正确命名生成的文件并在代码中添加其他属性,以便生成的enum不会被代码分析仔细检查;
  • 多字查找表值正确连接到以pascal为基础的等价物(即多字值变为MultiWordValue);
  • 枚举值始终以字母开头;
  • 所有枚举值仅包含字母和数字,其他所有内容都被删除;

反正。 this blog post中记录了所有内容。