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

Vin*_*lla 9 .net ado.net t4 enums entity-framework

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

Dan*_*son 10

使用T4模板可能要容易得多.这是一篇关于入门的非常好的文章

我下面的示例使用直接SQL连接,但正如您所看到的,您可以包含任何代码并生成您喜欢的任何输出到编译到项目中的cs文件中.您可以使用通过Entituy Framework模型检索的对象集合上的枚举替换下面的ADO语法,并相应地输出.

在您希望生成枚举文件的目录中创建扩展名为.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() #>
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试改进这一点.而不是写入StringBuilder,将每个reader.Read()的结果直接输出到输出.此外,我已经包含了一个尚不存在的FixName方法,但您可能需要它来取出空格或非法字符.


Rob*_*nik 7

Daniel的模板很好,但是我已经为这样的模板付出了更多的努力,所以它完成了所有这些:

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

无论如何.这篇博客文章中记录了一切.

  • 优秀.好跟进 (2认同)