2011-12-30 114 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