如何在entity framework中使用枚举?

在Entity Framework中使用Enums的最佳方式是什么?

备注:我正在使用EF 3和Firebird。

在EF 4中有一个更好的方法 。 不幸的是,它在EF 1中不起作用。

这是另一种方法 。

更新: 2011年6月EF CTP增加了真正的枚举支持。

更新:
entity framework现在支持枚举诞生。

原版的:
这是关于EF的那些令人烦恼的事情之一。 不会支持它!

或者你可以做一些事情:

public MyEnum MyEnumProperty { get { return (MyEnum) InnerEnumProperty; } set { InnerEnumProperty = (int) value; } } 

但这让我觉得很肮脏。

这个问题已经有点老了,但是让我来指出一个更新的材料,因为今天我们有了更新版本的entity framework:

video:Entity Framework 5从EF 4.3中引入和移动解决scheme Julie Lerman

我今天使用这个video来enumsentity framework中的enums 。 这是一个很好的一步一步的示范。 希望它也能帮助你。

在Entity Framework Design博客上也有这个介绍性文章:

枚举支持entity framework

我在表单的DB中大量使用了表(默认值)

 CREATE TABLE [dbo].[CommunicationPreferences] ( [ID] smallint NOT NULL, [SystemName] nvarchar(50) NOT NULL, [Description] nvarchar(200) NOT NULL, ) 

我从数据库中驱动我的EF4实体。

NB我没有使用视图,SPROCS或SQL函数,没有复杂的EFtypes,只是直接表到实体的映射。 然后扩展我的实体部分类来添加额外的function,以保持干燥。

对于枚举我有一个简单的T4模板,我递交一个表(上面的表格),当我从数据库更新EF模型(或者如果我需要按需)时,.tt文件被触发,它抓取数据,并build立枚举例如

 /// <summary> /// Enums For The dbo Schema /// </summary> public enum CommunicationPreferencesList : short { /// <summary> /// HTML Emails /// </summary> [EnumTextValue(@"HTML Emails")] HTMLEmail = 1, /// <summary> /// Plain Text Emails /// </summary> [EnumTextValue(@"Plain Text Emails")] PlainEmail = 2, /// <summary> /// Mobile Telephone /// </summary> [EnumTextValue(@"Mobile Telephone")] Mobile = 3, /// <summary> /// Landline Telephone /// </summary> [EnumTextValue(@"Landline Telephone")] Landline = 4, /// <summary> /// SMS /// </summary> [EnumTextValue(@"SMS")] SMS = 5, } 

那么当我正在处理某个实体的FK ID列/ Property时,

 Users.CommunicationPreferenceID 

我只是简单地将ID或枚举进行比较。 例如

 CommunicationPreferencesList usersPreference = (CommunicationPreferencesList)currentUser.CommunicationPreferenceID; if(usersPreference == CommunicationPreferencesList.SMS) { //send SMS } else if(usersPreference == CommunicationPreferencesList.Mobile) { //ring the phone } 

然后我有一些简单的助手,例如从一个枚举实例给EnumTextValue

 string chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile); => "Mobile Telephone" 

我觉得这个简单,无忧无虑,透明,易于使用,并为我的目的,这是一种享受,我很高兴。 我不认为需要从消费代码中完全屏蔽数据库/实体中的数字值,我非常乐意将其中的一个值或其他值进行转换,并以相当干净的可读代码加上可爱的小额外代码从数据库中的[Description]字段生成的EnumTextValue。

我有一个类似的问题,并通过部分类机制写入实体的扩展来解决它。 我只是添加了一个属性,该属性已经在实体中进行了数据库字段的转换,在我们的例子中只是一个整数。

唯一的缺点是添加一个忽略序列化属性,例如当与WCF结合使用时。