2011-12-30 116 views
6

試圖創建一個解決方法來處理使用泛型的實體框架中的枚舉,但EF似乎並不關心泛型屬性。例如:實體框架 - 一般堅持枚舉?

public enum MyEnum 
{ 
    One, Two, Three 
} 

public class SomePOCOWithEnum 
{ 
     // I want this to persist as an int, but EF doesn't like generics. 
     public EnumWrapper<MyEnum> MyEnumProperty { get; set; } 
} 

意圖是讓枚舉持久化爲數據庫中的INT。有沒有什麼特殊的方式使用流利或其他機制的方法,我可以創建所述泛型類,並保持它作爲EF內的數據庫INT?

其意圖是保持通用性,因爲我有大約二十幾個需要持久的枚舉,並且我寧願不爲它們中的每一個編寫單獨的包裝類。

這裏是通用EnumWrapper類,這表明想我做到:隱式轉換到枚舉,但持久性作爲一個int:

public class EnumWrapper<T> where T : struct 
{ 
    private T enumValue; 
    public int Value 
    { 
     get { return Convert.ToInt32(enumValue); } 
     set { enumValue = (T)Enum.Parse(typeof(T), value.ToString()); } 
    } 

    public T EnumValue 
    { 
     get { return enumValue; } 
     set { enumValue = value; } 
    } 

    public static implicit operator T(EnumWrapper<T> wt) 
    { 
     return wt.EnumValue; 
    } 

    public static implicit operator EnumWrapper<T>(T t) 
    { 
     return new EnumWrapper<T>() { EnumValue = t }; 
    } 

    public override string ToString() 
    { 
     return enumValue.ToString(); 
    } 
} 
+0

你爲什麼要打包枚舉?這似乎非常麻煩。 – phoog 2011-12-30 22:34:56

+0

因爲EF不會持續枚舉。我願意接受任何更好的方式。 – 2011-12-31 16:46:57

+2

Enum支持被添加到EF 5,所以你可能想[檢查出來](http://msdn.microsoft.com/en-us/data/hh859576.aspx) – sinelaw 2012-10-17 01:28:40

回答

4

正如sinelaw已經指出的那樣,EF5有明確的支持對於枚舉來說,但是如果你無論出於何種原因都不能遷移到它,我採取的方法可能適用於你。

對於這個例子,假設該表名爲「Email」,我們有一個名爲「Priority」的列。像通常那樣將列設置爲int。接下來,在你的實體項目中,創建一個映射枚舉類的int類型:

public enum EmailPriorityEnum 
{ 
    Now = 100, 
    Soon = 1000, 
    Whenever = 10000 
} 

最後,在你的實體項目中,創建一個局部類文件符合實體和手動映射有枚舉:

public partial class Email 
{ 
    public EmailEnums.EmailPriorityEnum EmailPriority 
    { 
     get { return (EmailEnums.EmailPriorityEnum)Priority; } 
     set { Priority = (int)value; } 
    } 
} 

從那裏開始,您的代碼可以透明地引用此屬性。這種方法的主要缺點是:

  1. 你必須要小心,所有可能的值都映射到枚舉與適當的ID。對於經常變化的枚舉,這會變成問題。
  2. 開發人員仍然可以訪問基礎列,除非您更改可訪問性,並且可以繞過枚舉並使用他們喜歡的任何值。
+0

謝謝希瑟。不幸的是,我試圖避免爲每個枚舉編寫單獨的屬性和/或包裝類,因爲我有大約二十幾個。基本上,如果存在這樣的解決方案,我試圖找到可以普遍重用的最有效的解決方案。一個我可以用於所有這些類的泛型類將是理想的,但這就是我被卡住的地方。 – 2012-10-19 15:12:05

+0

當然,如果可以的話,升級到EF5將是最普遍的解決方案。 :) – 2012-10-19 15:16:06