【问题标题】:Coping with Lagging Enum Support应对滞后的枚举支持
【发布时间】:2012-02-07 22:40:22
【问题描述】:

在 EF 5.0(计划很快发布)之前,实体框架将不支持枚举。

Entity Framework 4.2 enum support

http://blogs.msdn.com/b/efdesign/archive/2011/06/29/enumeration-support-in-entity-framework.aspx

http://visualstudiomagazine.com/blogs/data-driver/2012/01/entity-framework-4-3-gets-final-tune-up.aspx

WCF 数据服务(和 oData 标准)不支持枚举

我们知道枚举很常见,不幸的是它们从未遇到过 酒吧到目前为止。它们在我们接下来要做的事情清单上相当高 虽然

(参见:https://stackoverflow.com/a/3571378/141172

我已经开始了一个新项目,并且正在将枚举替换为以下内容:

public static class MyEnum
{
    public const int MyValue = 0;
    public const int AnotherValue = 1;
}

我牺牲了枚举提供的保证,即只分配定义的值,以便利用重要的(并且在这一点上相当成熟的)基础设施服务。

有没有更好的方法来处理滞后的枚举支持?一旦 EF 和 WCF 数据服务添加了枚举支持,是否有可能出现另一个重要的框架,它将像这两个一样缓慢地引入枚举支持?

【问题讨论】:

  • 对读者的教育只是一个小问题。枚举不验证该值是否为“命名”值之一。如果 Color 被定义为公共枚举 Color { Red, Blue, Green },我可以轻松地将 ((Color)43) 传递给任何想要颜色的东西

标签: .net entity-framework enums wcf-data-services


【解决方案1】:

您能否使用带有私有构造函数的结构,该构造函数为每个值定义一个公共静态成员:

public struct FakeEnum
    {
        public static readonly FakeEnum MyValue = new FakeEnum(0);
        public static readonly FakeEnum AnotherValue = new FakeEnum(1);

        private readonly int _value;

        private FakeEnum(int value)
        {
            _value = value;
        }

        public int Value { get { return _value; } }

        // TODO: Equals and GetHasCode and Operators Oh My!
    }

注意:我还没有真正尝试过。

【讨论】:

  • Entity Framework 将如何处理该结构?创建一个新表?除了未知之外,我确实喜欢这提供了更多的价值安全性。
【解决方案2】:

比您的示例更好的是使用枚举来保存常量值并每次都转换为 int。这样,您至少可以在可能的情况下使用枚举,而不是丢失所有内容。

枚举从不提供不可避免的类型安全。但是,通过将枚举的使用尽可能扩展到应用程序代码和业务逻辑中,您可以越来越安全地避免细微的使用错误。

【讨论】:

  • 我在之前的项目中使用了 cast-to-int 模式。这种模式让我的模型变得混乱,因为它有一个在代码中使用的枚举属性,以及一个必须公开的匹配的仅用于持久性的属性(供 EF 使用),并且可能会让模型使用者感到困惑。
  • 我只使用 int 属性。
  • 我明白了......仍然,这是一个令人困惑的代码合同,例如对于 UI 开发人员来说,没有什么能阻止他们直接将 int 分配给属性。
  • 实际上也没有什么可以阻止人们为枚举属性分配错误的值。由于语言/运行时不会阻止您将 int 显式转换为任何枚举。因此,您无法获得运行时保证该值始终适合枚举。它只是让它在 IDE 中看起来不错。
  • 枚举永远不会提供不可避免的类型安全。但是,通过将枚举的使用尽可能扩展到应用程序代码和业务逻辑中,您可以越来越安全地避免细微的使用错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2016-10-26
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多