Ho avuto questo problema per quanto mi ricordo e onestamente non so il motivo per cui non ha MS aggiungere questa funzione (NH può fare come da sempre. .).
Eventuali modi, quello che di solito fatto è utilizzare classi di stringhe const come:
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;
}
}
Contro - semplice come può essere.
Aspetti negativi: si perde il controllo del tipo (anche se potrebbe essere applicato a livello di codice).
Quindi questa volta ho cercato di pensare a qualcosa di più ambizioso. Così ho preso il concetto descritto da Brian (che ha alcuni aspetti negativi quando ad esempio un dato enum è ampiamente utilizzato nel dominio). E bene .. Ho ottenuto il seguente lavoro:
Una base di classe componente per memorizzare i valori:
[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();
}
}
... che sarebbe sostanzialmente sufficiente .. tranne EF non supporta i tipi generici .. .
Ciò significa che per ogni enum devi avere qualcosa di simile ...
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();
}
}
che ti dà un po 'di caldaia-piastra che potrebbero essere facilmente generato per esempio usando i modelli T4.
che alla fine si finisce con l'utilizzo di:
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
Ma dal momento che si dispone di conversione implicita in atto, dichiarazioni di classe sono gli unici ad essere a conoscenza dei tipi di supporto.
Un'enumerazione è un oggetto statico, non è necessario salvarlo nel database ... In realtà è necessario definire gli elementi nel database e quindi generare l'enum nel codice utilizzando un modello T4. –
Un valore enum _is_ un int. Dovresti davvero salvarlo così. A meno che tu non abbia una buona ragione per averla come una stringa nel DB .. Che suppongo tu non lo faccia. –
@ Pierre-LucPineault: non è pericoloso memorizzarlo come un int? Non tutti gli utenti devono riordinare l'enumerazione e quindi immediatamente tutti i valori nel database puntano all'enumerazione errata senza alcun avviso – Diskdrive