如何在Entity Framework中使用Enums?

时间:2009-10-06 15:27:15

标签: .net entity-framework enums

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

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

5 个答案:

答案 0 :(得分:27)

There is a somewhat better way to do it in EF 4。不幸的是,它不适用于EF 1。

这是another approach

更新: 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。这是一个很好的一步一步的演示。希望它也能帮到你。

还有关于实体框架设计博客的这篇介绍性帖子:

Enumeration Support in Entity Framework

答案 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结合使用时。