C# 4.0 在实体框架4.0中伪造枚举

C# 4.0 在实体框架4.0中伪造枚举,c#-4.0,entity-framework-4,poco,C# 4.0,Entity Framework 4,Poco,对于EntityFramework4.0中缺少对枚举的支持,有很多解决方法。从所有这些中,我最多喜欢这一个: 此解决方法允许您在LINQ查询中使用枚举,这正是我所需要的。但是,我对这种变通方法有一个问题。对于我使用的每个复杂类型,我都会得到一个新的部分自动生成类。因此,代码不再编译,因为在同一名称空间中已经有一个同名的包装类,它在数据库中的备份整数和POCO类中的枚举之间进行转换。如果我将包装器设置为分部类,代码仍然不会编译,因为它现在包含两个同名“Value”的属性。唯一的可能性是每次生成P

对于EntityFramework4.0中缺少对枚举的支持,有很多解决方法。从所有这些中,我最多喜欢这一个:

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

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


你能给我推荐一些在LINQ查询中支持枚举的其他解决方案吗?

该解决方案基于这样一个事实,即你自己编写POCO类=不自动生成。如果您想将其用于自动生成,则必须对T4模板本身进行大量修改

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

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

我使用的方法基于您的链接中描述的方法,没有对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;
    }
}

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

这不是缺少
Value
属性的定义吗?@superjos,正如我在代码下面的文本中所述,在这种情况下,
Value
是一个自动生成的
int
属性,它定义在分部类的自动生成部分(模型优先方法)。不管怎样,从那以后。哦,我明白了。我必须重读一遍才能注意到这一点。谢谢你的反馈。
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;
    }
}