Должен ли EnumDataTypeAttribute корректно работать в .NET 4.0 с использованием Entity Framework? - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть перечисление, которое я хотел бы сохранить как какое-то значение в базовой базе данных, чтобы я мог переносить его назад и вперед.

Я прочитал несколько статей, в которых предлагается создать оболочку перечисления с определенными статическими неявными операторами, сопоставленными с использованием сопоставления объектов ComplexType, как описано в ссылке ниже.

Как подделать Enums в EF4

Это решение работает без нареканий! Благодарю Алекс Джеймс .

Кроме того, я обнаружил EnumDataTypeAttribute Class, цель которого, кажется, обрабатывает персистентность перечислений через Entity Framework. Я попробовал это, и это, кажется, не работает вообще. Вот пример кода.

public enum StreetDirection {
    East
    , None
    , North
    , NorthEast
    , NorthWest
    , South
    , SouthEast
    , SouthWest
    , West
}

public enum StreetType {
    Avenue
    , Boulevard
    , Court
    , Crescent
    , Drive
    , Hill
    , None
    , Road
    , Street
}

public class StreetTypeWrapper {
    public int Value {
        get {
            return (int)t;
        } 
        set {
            t = (StreetType)value;
        }
    }
    public StreetType EnumValue {
        get {
            return t;
        } 
        set {
            t = value;
        }
    }

    public static implicit operator int(StreetTypeWrapper w) {
        return w.Value;
    }

    public static implicit operator StreetType(StreetTypeWrapper w) {
        return w == null ? StreetType.None : w.EnumValue;
    }

    public static implicit operator StreetTypeWrapper(int i) {
        return new StreetTypeWrapper() { Value = i };
    }

    public static implicit operator StreetTypeWrapper(StreetType t) {
        return new StreetTypeWrapper() { EnumValue = t };
    }

    private StreetType t;
}

public class Street {
    [EnumDataType(typeof(StreetDirection))]
    public StreetDirection Direction { get; set; }
    public string Name { get; set; }
    public int StreetId { get; set; }
    public StreetTypeWrapper Type { get; set; }
}

public class StreetTypeMapping 
    : ComplexTypeConfiguration<StreetTypeWrapper> {
    public StreetTypeMapping() {
        Property(o => o.Value)
            .HasColumnName("StreetType");
    }
}

Теперь, если я верю и / или правильно понимаю, что MSDN говорит о классе EnumDataTypeAttribute, свойство Direction должно быть сохранено в базе данных. Ну, это не так! Я не могу найти причину этого, за исключением того, что EF не поддерживает постоянство перечислений. Что касается StreetTypeWrapper и его StreetTypeMapping класса, он работает безупречно.

Есть ли какая-нибудь подсказка, почему EnumDataType не должен работать должным образом?

1 Ответ

10 голосов
/ 10 ноября 2011

Это из-за недостатка дизайна в .NET Framework. .NET Framework содержит известное пространство имен System.ComponentModel.DataAnnotations, в котором определены различные атрибуты. Многие разные части .NET Framework используют это пространство имен, но они используют его для решения различных задач, и каждая такая часть использует только некоторое подмножество атрибутов. Это вызывает много путаницы.

EnumDataTypeAttribute является таким примером. Этот атрибут только для динамических данных ASP.NET. Это позволяет пометить свойство int этим атрибутом, и автоматически сгенерированный пользовательский интерфейс покажет выпадающий список со значениями перечисления вместо текстового поля для числовых значений. Таким образом, существует отображение от enum к int, но оно находится на уровне пользовательского интерфейса, а не на уровне модели / персистентности.

...