2014-01-13 1 views
3

Я хочу использовать метод в this article для реализации более дружественных выходов ToString() для моих типов перечислений. Я хотел бы знать, как это можно сделать в автоматических сгенерированных кодах Enum Framework? Должен ли я изменить шаблон генерации кода (если это так, может кто-то любезно дать мне некоторое руководство, поскольку шаблон довольно сложный), или может кто-то предложить альтернативный метод?Entity Framework Enum и ассоциация строк

Спасибо!

+0

Что вы подразумеваете под "auto generated Enum codes"? Вы говорите об использовании подхода «model/DB first»? – Floremin

+0

Это охватывает поддержку enum для первого подхода к базе данных EF: http://stackoverflow.com/questions/17731557/enum-support-fority-framework-database-first Посмотрите альтернативные ответы, а также на дополнительные ссылки , – Floremin

+0

@Floremin: Да, я сначала использую модель. Таким образом, вся моя модель выполняется через дизайнера, включая мои типы перечислений. Поэтому классы, содержащие декларации перечислений, автоматически генерируются EF T4.Теперь проблема в том, что мои перечисления трудно использовать на моем веб-сайте ASP.net из-за ограниченного наименования типа перечисления, сценарий, описанный именно в связанной статье, в которой автор использовал DescriptionAttribute (отражение), чтобы обойти вопрос. Я не думаю, что это можно сделать в EF, но без обширной модификации шаблона T4, поскольку код автогенерируется? –

ответ

6

Вы можете использовать свой собственный тип перечисления в модели EF, вместо создания нового перечисления в модели дизайнера. Вот как:

В модели дизайнера Нажмите правую кнопку мыши на поверхности и выберите:

Add New -> Enum Тип ...

В диалоговом окне, просто установите флажок:

Ссылка внешний вид

и введите тип: namespace.MyEnum

Затем создайте столбцы в своих таблицах, чтобы использовать этот тип.

Поскольку вы, вероятно, собираетесь модифицировать существующую модель, убедитесь, что нет путаницы между типом перечисления из модели и (внешним) типом перечисления из вашего кода. Лучший подход - удалить тип перечисления, который вы ранее создали в модели, и настроить столбцы для использования связанного типа перечисления из вашего кода.

Теперь вы можете объявить свой тип перечисления с атрибутами описания, как вы планировали.

+0

Большое спасибо за указание внешней ссылочной опции, которую я всегда пропускал. Я попробовал это, и он работает отлично. Дизайнер EF по-прежнему имеет доступ к новым типам перечислений таким образом, что означает, что они могут быть легко использованы как типы свойств для моих объектов (нет необходимости вручную устанавливать что-либо в базе данных). Я очень доволен. –

4

Вам не нужно создавать обходные пути для перечислений. Они поддерживаются в последней платформе Entity Framework.

Чтобы сделать ваши перечисления дружественными на ваш сайт, вы можете использовать атрибуты. Ниже приведен пример атрибут:

public class EnumDescription : Attribute 
{ 
    public string Text { get; private set; } 

    public EnumDescription(string text) 
    { 
     this.Text = text; 
    } 
} 

Всех ваши перечисления с атрибутом:

public enum DaylightSavingTime 
{ 
    [EnumDescription("Detect automatically")] 
    Auto = 0, 
    [EnumDescription("DST always on")] 
    AlwaysOn = 1, 
    [EnumDescription("DST always off")] 
    AlwaysOff = 2 
} 

Добавить расширения для включения ToDescription() метода:

public static class EnumExtensions 
{ 
    public static string ToDescription(this Enum enumeration) 
    { 
     Type type = enumeration.GetType(); 
     MemberInfo[] memInfo = type.GetMember(enumeration.ToString()); 

     if (null != memInfo && memInfo.Length > 0) 
     { 
      object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumDescription), false); 
      if (null != attrs && attrs.Length > 0) 
       return ((EnumDescription)attrs[0]).Text; 
     } 

     return enumeration.ToString(); 
    } 
} 

Использование:

var blabla = DaylightSavingTime.Auto; 
Console.WriteLine(blabla.ToDescription()); 

Выхода :

Detect автоматически

+0

Да, я понимаю, что это поддерживается, и я уже использую его. Моя проблема заключается в том, что из-за ограничения имен для перечисления (например, член может быть назван только NewYork, а не в Нью-Йорке), мои типы перечислений трудно использовать на моем веб-сайте asp.net (как описано в этой статье, которую я связал) , –

+0

@ user3144721, я обновил ответ (если вам это нравится, проголосуйте) –

+0

Оцените свой ответ, хотя я связал статью, которая описывает это (используя атрибут для дружественного имени enum) в моем исходном сообщении. Моя проблема заключалась в том, что с помощью конструктора моделей EF объявления перечислений автоматически генерируются и не редактируются (любая модификация автоматически генерируемых файлов классов будет перезаписана в любое время после обновления модели), и поэтому я не могу добавить атрибуты. Метод Флоремина (запись переписей извне) представляется моим единственным выбором, если я хочу выполнить это во время разработки. –

 Смежные вопросы

  • Нет связанных вопросов^_^