在Entity Framework中使用Enums的最佳方法是什么?
备注:我正在使用EF 3和Firebird。
答案 0 :(得分:27)
There is a somewhat better way to do it in EF 4。不幸的是,它不适用于EF 1。
更新: 在the June 2011 EF CTP中添加了真正的枚举支持。
答案 1 :(得分:19)
<强>更新强>
实体框架现在支持Enums nativity。
<强>原始强>
这是关于EF的那些恼人的事情之一。不会支持它!
或者您可以执行以下操作:
public MyEnum MyEnumProperty
{
get { return (MyEnum) InnerEnumProperty; }
set { InnerEnumProperty = (int) value; }
}
但它让我觉得很脏。
答案 2 :(得分:11)
这个问题有点陈旧,但是让我指出一个更近期的材料,因为今天我们有了更新版本的实体框架:
Julie Lerman的Video: Entity Framework 5 Enums and Moving Solution from EF 4.3
我今天使用此视频来了解实体框架中的enums
。这是一个很好的一步一步的演示。希望它也能帮到你。
还有关于实体框架设计博客的这篇介绍性帖子:
答案 3 :(得分:6)
我在表格
的DB中大量使用表格(默认值)CREATE TABLE [dbo].[CommunicationPreferences]
(
[ID] smallint NOT NULL,
[SystemName] nvarchar(50) NOT NULL,
[Description] nvarchar(200) NOT NULL,
)
我从数据库中驱动我的EF4实体。
N.B。我没有使用视图,SPROCS或SQL函数,没有复杂的EF类型,只是直接表到实体映射。然后扩展我的实体部分类以添加其他功能以保持干燥。
对于枚举我有一个简单的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,
}
然后当我在某个实体上处理FK ID列/ Property时,例如
Users.CommunicationPreferenceID
我只是为了比较而投射ID或枚举。 e.g。
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中的[Description]字段生成的EnumTextValue。
答案 4 :(得分:0)
我遇到了类似的问题,并通过部分类机制在实体上编写扩展来解决它。我刚添加了一个属性,它已经在实体中进行了DB字段的转换,在我们的例子中只是一个整数。
唯一的缺陷是添加一个忽略序列化属性,例如与WCF结合使用时。