我記得我儘量有這個問題,老實說,我不知道爲什麼沒有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;
}
}
缺點 - 就這麼簡單就可以了。
下降 - 你鬆散的類型檢查(儘管它可以通過編程實現)。
所以這次我試着去想更有野心的事情。所以我採用了Brian所描述的概念(當某個枚舉在域中被廣泛使用時,它有一些缺點)。和好..我得到了以下工作:
基本組件類存儲的值:
[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