【问题标题】:Faking enums in Entity Framework 4.0在 Entity Framework 4.0 中伪造枚举
【发布时间】:2011-04-05 07:43:10
【问题描述】:

对于 Entity Framework 4.0 中缺少对枚举的支持,有很多解决方法。在所有这些中,我最喜欢这个:

http://blogs.msdn.com/b/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx?PageIndex=2#comments

此解决方法允许您在 LINQ 查询中使用枚举,这正是我所需要的。但是,我对这种解决方法有疑问。我得到了每个复杂类型,我正在使用一个新的部分自动生成的类。因此,代码不再编译,因为我已经在同一个命名空间中有一个具有此名称的包装类,它在数据库中的支持整数和枚举之间进行转换在我的 POCO 课程中。如果我将包装器设为部分类,则代码仍然无法编译,因为它现在包含两个具有相同名称“Value”的属性。唯一的可能性是每次生成 POCO 类时手动删除 Value 属性,因为 DB 模型发生了变化(在开发阶段经常发生)。

您知道如何防止每次 EF 模型更改时从复杂属性中生成部分类吗?

您能否推荐一些其他支持 LINQ 查询中枚举的解决方法?

【问题讨论】:

    标签: c#-4.0 entity-framework-4 poco


    【解决方案1】:

    该解决方法基于您自己编写 POCO 类 = 没有自动生成这一事实。如果您想将它与自动生成一起使用,您必须大量修改 T4 模板本身。

    其他解决方法是将枚举转换封装为自定义扩展方法。

    public static IQueryable<MyEntity> FilterByMyEnum(this IQueryable<MyEntity> query, MyEnum enumValue)
    {
        int val = (int)enumValue;
        return query.Where(e => e.MyEnumValue == val);
    }
    

    然后您将调用:

    var data = context.MyEntitites.FilterByMyEnum(MyEnum.SomeValue).ToList();
    

    【讨论】:

      【解决方案2】:

      我正在使用一种基于您的链接中描述的方法,而无需对 T4 模板进行任何修改。我的部分包装类的内容如下:

      public partial class PriorityWrapper
      {
          public Priority EnumValue
          {
              get
              {
                  return (Priority)Value;
              }
              set
              {
                  Value = (int)value;
              }
          }
      
          public static implicit operator PriorityWrapper(Priority value)
          {
              return new PriorityWrapper { EnumValue = value };
          }
      
          public static implicit operator Priority(PriorityWrapper value)
          {
              if (value == null)
                  return Priority.High;
              else
                  return value.EnumValue;
          }
      }
      

      我只使用自动生成的 int 类型的 Value 属性更改了它,而不是使用枚举值的后台存储变量。因此 Value 可以是一个自动实现的属性,而 EnumValue 属性需要在 getter 和 setter 方法中进行转换。

      【讨论】:

      • 那不是缺少Value属性的定义吗?
      • @superjos 正如我在代码下方的文本中所描述的,在这种情况下,Value 是一个自动生成的int 属性,它在部分类的自动生成部分中定义(模型优先方法) .不管怎样,proper enum support has been added in EF5 从那时起。
      • 哦,我明白了。我必须重新阅读才能注意到这一点。感谢您的反馈。
      猜你喜欢
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多