私は私が覚えている限りでは、この問題を抱えていたし、正直私はなぜMSは、(NHが常に以来のようにそれを行うことができ、この機能を追加していないかわかりません。 )。私は通常のようにconstの文字列クラスを使用しなかったものを
どれかの方法、:
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();
}
しかし、あなたが所定の位置に暗黙の型変換を持っているので、クラスの宣言はヘルパーのタイプを認識するための唯一のものです。
列挙型は静的オブジェクトなので、データベースに保存する必要はありません。実際にはデータベース内の項目を定義し、T4テンプレートを使用して列挙型でコードを生成する必要があります。 –
列挙型の値_is_はintです。あなたは本当にそのように保存する必要があります。あなたはDBの文字列としてそれを持っている非常に良い理由がない限り..あなたはそうしないと思います。 –
@ Pierre-LucPineault:intとして保存するのは危険ではないですか?すべての人が列挙型を並べ替えるだけでなく、すぐにデータベースのすべての値が間違った列挙型を指しているのではないでしょうか? – Diskdrive