Генерировать Enum из значений, представленных в таблице, используя платформу ADO.NET - PullRequest
9 голосов
/ 14 апреля 2010

Мое требование - создать Enum на основе значений, представленных в таблице из БД. Я использую модель ADO.NET Entity Framework (файл .edmx). Может ли кто-нибудь из вас мне помочь.

Ответы [ 2 ]

10 голосов
/ 14 апреля 2010

Вероятно, гораздо проще использовать шаблоны 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 выведите результаты каждого чтения. Read () непосредственно в вывод. Кроме того, я включил метод FixName, который еще не существует, но он может понадобиться для удаления пробелов или недопустимых символов.

7 голосов
/ 08 января 2011

Шаблон Даниэля хорош и все, но я приложил еще больше усилий для такого шаблона , поэтому он делает все это:

  • генерирует значения перечисления с явными целочисленными значениями;
  • использует соглашение об именах пространства имен Visual Studio, поэтому сгенерированные перечисления имеют пространство имен проекта по умолчанию с добавленными подпапками (как и любой файл кода в Visual Studio);
  • добавляет полную XML-документацию перечисления с использованием значений столбцов таблицы дополнительного описания; если у вас их нет, не обращайте внимания;
  • правильно называет сгенерированный файл и добавляет в код дополнительный атрибут, чтобы сгенерированный enum не анализировался при анализе кода;
  • Значения таблицы поиска в нескольких словах правильно объединяются в эквивалентные символы в паскалях (т. Е. Значение из нескольких слов становится MultiWordValue);
  • значения перечисления всегда начинаются с буквы;
  • все значения перечисления состоят только из букв и цифр, все остальное исключается;

Во всяком случае. Все очень хорошо задокументировано в этом посте .

...