【问题标题】:How to work with Enums in Entity Framework?如何在实体框架中使用枚举?
【发布时间】:2010-12-04 07:45:37
【问题描述】:

在实体框架中使用枚举的最佳方式是什么?

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

【问题讨论】:

标签: .net entity-framework enums


【解决方案1】:

There is a somewhat better way to do it in EF 4。不幸的是,它在 EF 1 中不起作用。

这里是another approach

更新: Realthe June 2011 EF CTP 中添加了枚举支持。

【讨论】:

【解决方案2】:

更新:
Entity Framework 现在支持 Enums nativity。

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

或者你可以这样做:

public MyEnum MyEnumProperty  
{  
  get { return (MyEnum) InnerEnumProperty; }  
  set { InnerEnumProperty = (int) value; }  
}

但这让我觉得很脏。

【讨论】:

  • 有点脏,但是还有一个问题,如果你在查询中使用这个字段,EF 会报错。对于这个问题,我创建了这个包装器:landman-code.blogspot.com/2010/08/…,它从您的实体外部允许您保持 EF 详细信息的清洁..
【解决方案3】:

我也遇到过类似的问题,通过部分类机制在实体上写扩展解决了。我刚刚添加了一个属性,该属性已经在实体中进行 DB 字段的转换,在我们的例子中只是一个整数。

唯一的缺陷是添加忽略序列化属性,例如与 WCF 结合使用时。

【讨论】:

    【解决方案4】:

    这个问题有点老了,但让我指出一个更新的材料,因为今天我们有一个更新版本的实体框架:

    Video: Entity Framework 5 Enums and Moving Solution from EF 4.3 朱莉·勒曼

    我今天使用这个视频来了解实体框架中的enums。这是一个很好的一步一步的演示。希望对你也有帮助。

    实体框架设计博客上也有这篇介绍性文章:

    Enumeration Support in Entity Framework

    【讨论】:

      【解决方案5】:

      我在数据库中大量使用表格(带有默认值)

      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。

      【讨论】:

      • 有趣的想法。但存在潜在的数据完整性问题。如果您删除/编辑现有数据库条目并重新生成 T4 模板,则使用已删除枚举的代码将无法编译。而且(更糟糕的是)如果有人不小心删除了一个数据库条目,然后重新恢复它,那么密钥可能会不同。然后保存到数据库的任何枚举值都将与枚举中的错误项目相关联(或者根本没有匹配的值)。也许反过来做 - 将枚举持久化到 db 可能不太容易出错?
      • 好吧,但我个人从来没有遇到过任何问题... 1. 我不在 PK col 上使用身份,所以不可能与自动递增 ID 不匹配 2. 它不会产生持久性的不同方式重要的是有人不会在没有另一个的情况下改变一个,或者有一种机制可以确保它们保持同步,即我使用自动默认值 sql 脚本来设置查找表数据(如果它以某种方式改变)在每个应用程序/数据库发布 4. 我们希望使用已删除条目的代码不编译。这就是重点!
      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多