2014-01-13 31 views
3

我想使用的方法this article實現友好的ToString()輸出爲我的枚舉類型。我想知道如何在Entity Framework的自動生成的枚舉代碼中完成這項工作?我是否需要修改代碼生成模板(如果是的話,是否可以給我一些指導,因爲模板相當複雜),還是有人可以提出一種替代方法?實體框架枚舉和字符串協會

謝謝!

+0

你是什麼意思的「自動生成的枚舉代碼」?你在談論使用「模型/數據庫第一」的方法嗎? – Floremin

+0

這涵蓋了EF數據庫第一種方法枚舉支持: http://stackoverflow.com/questions/17731557/enum-support-for-entity-framework-database-first看看在備選答案,以及額外的鏈接。 – Floremin

+0

@Floremin:是的,我先使用模型。所以我的整個模型都是通過設計器完成的,包括我的枚舉類型。包含枚舉聲明的類因此是由EF的T4自動生成的。現在的問題是,我的枚舉在我的ASP.net網站很難使用,因爲枚舉類型的命名是有限的,這個場景完全在我鏈接的文章中描述,其中作者使用DescriptionAttribute(反射)來解決問題。我不認爲這可以在EF中完成,儘管沒有對T4模板進行大量修改,因爲代碼是自動生成的? –

回答

6

你可以用在你的EF模型自己的枚舉類型,而不是創建的模型設計一個新的枚舉。具體方法如下:

在模型設計,rght單擊表面,然後選擇:

新增 - >枚舉類型...

在對話框中,只要設置複選框:

參考外部類型

,並輸入你的類型:namespace.MyEnum

然後在您的表中創建列以使用此類型。

既然你可能要修改現有的模式,確保沒有從模型中枚舉類型,並從你的代碼(外部)枚舉類型之間不存在混淆。最好的辦法是去除之前在模型中創建的枚舉類型,並調整列以使用代碼中的關聯枚舉類型。現在

,你可以用你的計劃描述屬性聲明的枚舉類型。

+0

非常感謝您指出我一直忽略的外部參考選項。我試過這個,它看起來很完美。 EF的設計者仍然可以通過這種方式訪問​​新的枚舉類型,這意味着他們可以很容易地用作我實體的屬性類型(不需要手動設置數據庫上的任何東西)。我非常滿意。 –

4

你並不需要作出的變通辦法枚舉。他們在最新的實體框架中得到支持。

爲了讓您枚舉型到你的網站,你可以使用屬性。下面是示例屬性:

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()); 

輸出:

自動檢測

+0

是的,我瞭解它的支持,我已經在使用它。我的問題是,由於枚舉的命名限制(例如,一個成員只能被命名爲NewYork,而不是紐約),我的asp.net類型很難在我的asp.net網站中使用(如我鏈接的文章中所述) 。 –

+0

@ user3144721,我已經更新了答案(如果您喜歡,請投票) –

+0

欣賞您的回覆,儘管我在原始文章中鏈接了描述此內容的文章(對友好枚舉名稱使用屬性)。我的問題是,使用EF的模型設計器,枚舉聲明是自動生成的並且是不可編輯的(任何對自動生成的類文件的修改都會在模型更新時被覆蓋),因此我無法添加屬性。 Floremin的方法(寫外部枚舉)似乎是我唯一的選擇,如果我想在設計時做到這一點。 –