Ich hatte dieses Problem so weit ich mich erinnern und ehrlich ich weiß nicht, warum MS nicht diese Funktion hinzufügen (NH kann es wie da immer tun. .).
Alle Möglichkeiten, was ich const strings Klassen Normalerweise ist das nicht genutzt haben, wie:
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;
}
}
Nachteile - so einfach kann sein.
Nachteile - Sie verlieren Typprüfung (obwohl es programmgesteuert erzwungen werden könnte).
Also dieses Mal habe ich versucht, etwas Ehrgeizigeres zu denken. Also nahm ich das von Brian beschriebene Konzept (das einige Nachteile hat, wenn beispielsweise ein gegebenes Enum in der Domäne weit verbreitet ist). Und gut .. Ich habe die folgenden Arbeiten:
Eine Basiskomponentenklasse, die Werte zu speichern:
[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();
}
}
... die .. grundsätzlich ausreichen würde, außer EF nicht generische Typen unterstützen .. .
Das bedeutet für jeden Enum Sie so etwas wie ...
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();
}
}
haben, die Ihnen einig Kessel-Platte gibt, die leicht zum Beispiel erzeugt werden könnten Verwenden von T4-Vorlagen.
Welche Sie schließlich mit der Verwendung endet:
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
Aber da Sie implizite Konvertierung an der richtigen Stelle, Klassendeklarationen sind die einzigen, die sich der Helfer Typen.
Eine Enumeration ist ein statisches Objekt, es hat keinen Sinn, es in der Datenbank zu speichern ... Eigentlich sollten Sie die Elemente in der Datenbank definieren und dann Ihre enum im Code mit einer T4-Vorlage generieren. –
Ein Enum-Wert _ist_ ein int. Sie sollten es wirklich so speichern. Es sei denn, Sie haben einen sehr guten Grund, um es als eine Zeichenfolge in der Datenbank zu haben. Was Sie nicht tun. –
@ Pierre-LucPineault: ist es nicht gefährlich, es als int zu speichern? Würde nicht alles jemand tun, ist die Reihenfolge neu ordnen und dann sofort alle Werte in Ihrer Datenbank zeigt auf die falsche Enum ohne Warnung – Diskdrive