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

9

我的需求是基于数据库表中的值创建一个枚举。我正在使用ADO.NET Entity Framework模型(.edmx文件),你们当中有谁能帮帮我。

2个回答

10
可能使用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() #>
    }
}

试着改进一下。与其将内容写入StringBuilder,不如直接将每个reader.Read()的结果输出到输出中。此外,我已经包含了一个还不存在的FixName方法,但你可能需要它来去除空格或非法字符。


我目前正在寻找一个有用的链接。 - Daniel Dyson
让我知道你的进展如何。 我会根据你的反馈编辑我的答案,使其对其他人更有帮助。 - Daniel Dyson
很高兴听到这个消息。您能否使用T4标签标记您的问题? - Daniel Dyson

7
丹尼尔的模板很不错,但我已经投入了更多的精力到这个模板中,所以它可以做到以下几点:
  • 生成具有显式整数值的枚举值;
  • 使用Visual Studio的命名空间命名约定,因此生成的枚举具有项目的默认命名空间并附加任何子文件夹(就像Visual Studio中的任何代码文件一样);
  • 通过使用额外的描述表列值添加完整的枚举XML文档;如果您没有这些信息也没关系;
  • 正确命名生成的文件并在代码中添加其他属性,以使生成的enum不会被代码分析审查;
  • 多字词查找表值正确连接为帕斯卡大小写等效项(即Multi word value变为MultiWordValue);
  • 枚举值始终以字母开头;
  • 所有枚举值仅由字母和数字组成,其他内容都被剪切掉。

总之,这篇博客文章中的所有内容都有很好的文档说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接