Ответ 1
У меня была эта проблема, насколько я помню, и, честно говоря, я не знаю, почему MS не добавила эту функцию (NH может делать это так, как всегда).
Любые способы, что я обычно делал, это использовать классы константных строк, например:
public static class MyEnum
{
public const string Foo = "Foo";
public const string Bar = "Bar";
}
public class Client
{
public string MyVal { get; set; }
public Client()
{
MyVal = MyEnum.Bar;
}
}
Минусы - так просто, как может быть.
Недостатки - вы теряете проверку типов (хотя ее можно применять программно).
Поэтому на этот раз я попытался придумать что-то более амбициозное. Поэтому я взял концепцию, описанную Брайаном (у которой есть некоторые недостатки, когда, например, данное перечисление широко используется во всем домене). И хорошо.. Я получил следующую работу:
Класс базового компонента для хранения значений:
[ComplexType]
public class DbEnum<TEnum>
{
public string _ { get; set; }
public DbEnum()
{
_ = default(TEnum).ToString();
}
protected DbEnum(TEnum value)
{
_ = value.ToString();
}
public TEnum ToEnum()
{
return _.ToEnum<TEnum>();
}
public static implicit operator DbEnum<TEnum>(TEnum value)
{
return new DbEnum<TEnum>(value);
}
public static implicit operator TEnum(DbEnum<TEnum> value)
{
return value.ToEnum();
}
}
... что было бы в основном достаточным.. кроме EF не поддерживает общие типы...
Это означает, что для каждого перечисления у вас должно быть что-то вроде...
public enum PrivacyLevel
{
Public,
Friends,
Private
}
public class PrivacyLevelEnum : DbEnum<PrivacyLevel>
{
public PrivacyLevelEnum() : this(default (PrivacyLevel))
{
}
public PrivacyLevelEnum(PrivacyLevel value) : base(value)
{
}
public static implicit operator PrivacyLevelEnum(PrivacyLevel value)
{
return new PrivacyLevelEnum(value);
}
public static implicit operator PrivacyLevel(PrivacyLevelEnum value)
{
return value.ToEnum();
}
}
Это дает вам некоторую котельную плиту, которая может быть легко сгенерирована, например, с использованием шаблонов T4.
Который наконец заканчивает Вас с использованием:
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
Но поскольку у вас есть неявное преобразование, объявления классов являются единственными, кто должен знать о вспомогательных типах.