【发布时间】:2010-12-04 07:45:37
【问题描述】:
在实体框架中使用枚举的最佳方式是什么?
备注:我正在使用 EF 3 和 Firebird。
【问题讨论】:
标签: .net entity-framework enums
在实体框架中使用枚举的最佳方式是什么?
备注:我正在使用 EF 3 和 Firebird。
【问题讨论】:
标签: .net entity-framework enums
There is a somewhat better way to do it in EF 4。不幸的是,它在 EF 1 中不起作用。
这里是another approach。
更新: Real 在the June 2011 EF CTP 中添加了枚举支持。
【讨论】:
更新:
Entity Framework 现在支持 Enums nativity。
原文:
这是关于 EF 的那些恼人的事情之一。还不支持!
或者你可以这样做:
public MyEnum MyEnumProperty
{
get { return (MyEnum) InnerEnumProperty; }
set { InnerEnumProperty = (int) value; }
}
但这让我觉得很脏。
【讨论】:
我也遇到过类似的问题,通过部分类机制在实体上写扩展解决了。我刚刚添加了一个属性,该属性已经在实体中进行 DB 字段的转换,在我们的例子中只是一个整数。
唯一的缺陷是添加忽略序列化属性,例如与 WCF 结合使用时。
【讨论】:
这个问题有点老了,但让我指出一个更新的材料,因为今天我们有一个更新版本的实体框架:
Video: Entity Framework 5 Enums and Moving Solution from EF 4.3 朱莉·勒曼
我今天使用这个视频来了解实体框架中的enums。这是一个很好的一步一步的演示。希望对你也有帮助。
实体框架设计博客上也有这篇介绍性文章:
【讨论】:
我在数据库中大量使用表格(带有默认值)
CREATE TABLE [dbo].[CommunicationPreferences]
(
[ID] smallint NOT NULL,
[SystemName] nvarchar(50) NOT NULL,
[Description] nvarchar(200) NOT NULL,
)
我从数据库中驱动我的 EF4 实体。
注意我不使用视图、SPROCS 或 SQL 函数,不使用复杂的 EF 类型,只是将表直接映射到实体。然后扩展我的实体部分类以添加额外的功能来保持干燥。
对于 Enums,我有一个简单的 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 列/属性时,例如
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 中的 [Description] 字段生成的 EnumTextValue。
【讨论】: