我想使用的方法this article實現友好的ToString()輸出爲我的枚舉類型。我想知道如何在Entity Framework的自動生成的枚舉代碼中完成這項工作?我是否需要修改代碼生成模板(如果是的話,是否可以給我一些指導,因爲模板相當複雜),還是有人可以提出一種替代方法?實體框架枚舉和字符串協會
謝謝!
我想使用的方法this article實現友好的ToString()輸出爲我的枚舉類型。我想知道如何在Entity Framework的自動生成的枚舉代碼中完成這項工作?我是否需要修改代碼生成模板(如果是的話,是否可以給我一些指導,因爲模板相當複雜),還是有人可以提出一種替代方法?實體框架枚舉和字符串協會
謝謝!
你可以用在你的EF模型自己的枚舉類型,而不是創建的模型設計一個新的枚舉。具體方法如下:
在模型設計,rght單擊表面,然後選擇:
新增 - >枚舉類型...
在對話框中,只要設置複選框:
參考外部類型
,並輸入你的類型:namespace.MyEnum
然後在您的表中創建列以使用此類型。
既然你可能要修改現有的模式,確保沒有從模型中枚舉類型,並從你的代碼(外部)枚舉類型之間不存在混淆。最好的辦法是去除之前在模型中創建的枚舉類型,並調整列以使用代碼中的關聯枚舉類型。現在
,你可以用你的計劃描述屬性聲明的枚舉類型。
非常感謝您指出我一直忽略的外部參考選項。我試過這個,它看起來很完美。 EF的設計者仍然可以通過這種方式訪問新的枚舉類型,這意味着他們可以很容易地用作我實體的屬性類型(不需要手動設置數據庫上的任何東西)。我非常滿意。 –
你並不需要作出的變通辦法枚舉。他們在最新的實體框架中得到支持。
爲了讓您枚舉型到你的網站,你可以使用屬性。下面是示例屬性:
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());
輸出:
自動檢測
是的,我瞭解它的支持,我已經在使用它。我的問題是,由於枚舉的命名限制(例如,一個成員只能被命名爲NewYork,而不是紐約),我的asp.net類型很難在我的asp.net網站中使用(如我鏈接的文章中所述) 。 –
@ user3144721,我已經更新了答案(如果您喜歡,請投票) –
欣賞您的回覆,儘管我在原始文章中鏈接了描述此內容的文章(對友好枚舉名稱使用屬性)。我的問題是,使用EF的模型設計器,枚舉聲明是自動生成的並且是不可編輯的(任何對自動生成的類文件的修改都會在模型更新時被覆蓋),因此我無法添加屬性。 Floremin的方法(寫外部枚舉)似乎是我唯一的選擇,如果我想在設計時做到這一點。 –
你是什麼意思的「自動生成的枚舉代碼」?你在談論使用「模型/數據庫第一」的方法嗎? – Floremin
這涵蓋了EF數據庫第一種方法枚舉支持: http://stackoverflow.com/questions/17731557/enum-support-for-entity-framework-database-first看看在備選答案,以及額外的鏈接。 – Floremin
@Floremin:是的,我先使用模型。所以我的整個模型都是通過設計器完成的,包括我的枚舉類型。包含枚舉聲明的類因此是由EF的T4自動生成的。現在的問題是,我的枚舉在我的ASP.net網站很難使用,因爲枚舉類型的命名是有限的,這個場景完全在我鏈接的文章中描述,其中作者使用DescriptionAttribute(反射)來解決問題。我不認爲這可以在EF中完成,儘管沒有對T4模板進行大量修改,因爲代碼是自動生成的? –