Подделка перечислений в Entity Framework 4.0 - PullRequest
0 голосов
/ 05 апреля 2011

Существует множество обходных путей для отсутствующей поддержки перечислений в 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». Единственная возможность - удалять свойство Value вручную каждый раз, когда я генерирую классы POCO, потому что модель DB изменилась (что на этапе разработки происходит очень часто).

Знаете ли вы, как предотвратить генерацию частичного класса из сложного свойства при каждом изменении модели EF?

Можете ли вы порекомендовать мне другие обходные пути, поддерживающие перечисления в запросах LINQ?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Этот обходной путь основан на том факте, что вы сами пишете свои классы POCO = нет автогенерации. Если вы хотите использовать его с автогенерацией, вы должны сильно изменить сам шаблон T4.

Другим обходным решением является преобразование перечисления enum в пользовательские методы расширения.

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();
0 голосов
/ 06 апреля 2011

Я использую подход, основанный на описанном в вашей ссылке, без каких-либо модификаций шаблонов 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. Следовательно, Value может быть автоматически реализованным свойством, а свойство EnumValue должно выполнять преобразование в методах получения и установки.

...