如何在Entity Framework中使用Enums?

Raf*_*mão 53 .net enums entity-framework

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

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

Cra*_*ntz 27

在EF 4中有一种更好的方法.不幸的是,它不适用于EF 1.

这是另一种方法.

更新: 2011年6月的EF CTP中添加了真实枚举支持.


Geo*_*off 19

更新:
实体框架现在支持Enums nativity.

原文:
这是关于EF的那些恼人的事情之一.不会支持它!

或者您可以执行以下操作:

public MyEnum MyEnumProperty  
{  
  get { return (MyEnum) InnerEnumProperty; }  
  set { InnerEnumProperty = (int) value; }  
}
Run Code Online (Sandbox Code Playgroud)

但它让我觉得很脏.

  • 它有点脏,但还有另一个问题,如果你在查询中使用这个字段,EF会抱怨.对于这个问题,我创建了这个包装器:http://landman-code.blogspot.com/2010/08/adding-support-for-enum-properties-on.html来自您实体外部的允许您保持清洁EF细节.. (2认同)

Len*_*rri 11

这个问题有点陈旧,但是让我指出一个更近期的材料,因为今天我们有了更新版本的Entity Framework:

视频:实体框架5枚举和移动解决方案来自EF 4.3 by Julie Lerman

我今天用这个视频来了解enums实体框架.这是一个很好的一步一步的演示.希望它也能帮到你.

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

实体框架中的枚举支持


Mem*_*per 6

我在表单的DB中大量使用表(使用默认值)

CREATE TABLE [dbo].[CommunicationPreferences]
(
    [ID] smallint NOT NULL,
    [SystemName] nvarchar(50) NOT NULL,
    [Description] nvarchar(200) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

我从数据库驱动我的EF4实体.

NB我没有使用视图,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,

}
Run Code Online (Sandbox Code Playgroud)

然后,当我在某个实体上处理FK ID列/属性时,例如

Users.CommunicationPreferenceID
Run Code Online (Sandbox Code Playgroud)

我只是为了比较而投射ID或枚举.例如

CommunicationPreferencesList usersPreference = (CommunicationPreferencesList)currentUser.CommunicationPreferenceID;

if(usersPreference == CommunicationPreferencesList.SMS)
{
//send SMS
}
else if(usersPreference == CommunicationPreferencesList.Mobile)
{
//ring the phone
}
Run Code Online (Sandbox Code Playgroud)

然后我有一些简单的帮助器,例如从枚举实例中提供EnumTextValue

string chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile);

 => "Mobile Telephone"
Run Code Online (Sandbox Code Playgroud)

我发现这个简单,轻松,透明,易于使用,并且为了我的目的,它是一种享受,我很高兴.我没有看到需要从消费代码中完全掩盖数据库/实体中的数值,我很乐意投射其中一个或另一个值,最后得到非常干净的可读代码,加上额外的小额外从DB中的[Description]字段生成的EnumTextValue.

  • 有趣的想法.但是,存在潜在的数据完整性问题.如果删除/编辑现有数据库条目并重新生成T4模板,则使用已删除枚举的代码将无法编译.而且(更糟糕的是)如果有人意外删除了数据库条目,然后重新设置它,那么密钥可能会有所不同.然后保存到数据库的任何枚举值都将与枚举中的错误项相关联(或者根本不存在匹配值).也许这样做反过来 - 将枚举持久化到db可能不那么容易出错? (2认同)