如何在Entity Framework中最好地使用枚举?
备注:我正在使用EF 3和Firebird。
如何在Entity Framework中最好地使用枚举?
备注:我正在使用EF 3和Firebird。
更新:
Entity Framework现在本地支持枚举。
原文:
这是EF中令人烦恼的事情之一。仍未支持它!
或者,您可以执行类似以下操作:
public MyEnum MyEnumProperty
{
get { return (MyEnum) InnerEnumProperty; }
set { InnerEnumProperty = (int) value; }
}
但这让我感觉很不好。
这个问题有点老了,但是让我指向一些更近期的资料,因为今天我们有一个更新版本的Entity Framework:
视频:Entity Framework 5中的枚举和从EF 4.3移动解决方案由Julie Lerman
我今天使用这个视频来了解在Entity Framework中使用enums
。它是一个很好的逐步演示。希望它也能帮助你。
还有这篇介绍性文章在Entity Framework Design博客上:
我经常在数据库中使用表格(默认值)
CREATE TABLE [dbo].[CommunicationPreferences]
(
[ID] smallint NOT NULL,
[SystemName] nvarchar(50) NOT NULL,
[Description] nvarchar(200) NOT NULL,
)
我从数据库中获取我的EF4实体。
注意:我不使用视图、SPROCS或SQL函数,也不使用复杂的EF类型,只是直接将表映射到实体。然后扩展我的实体部分类以添加其他功能,以保持DRY(Don't Repeat Yourself)原则。
对于枚举,我有一个简单的T4模板,我手动提供一个表列表(如上所述),每当我从数据库更新EF模型时(或者在需要时),.tt文件就会被触发,它获取数据并构建枚举,例如:
/// <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,
}
当我处理一些实体上的外键ID列/属性时,比如:
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"
我曾经遇到过类似的问题,并通过使用部分类机制编写实体扩展来解决它。我只是添加了一个属性,该属性在实体中执行DB字段的转换,对于我们的情况只是一个整数。
唯一需要注意的是要添加一个忽略序列化属性,例如在与WCF结合使用时。