如何在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来enums
entity 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结合使用时。