Ben bildiğim kadarıyla bu sorunu vardı ve dürüstçe NH hep beri gibi bunu yapabilir (MS bu özelliği eklemek vermedi neden bilmiyorum. .). Genellikle is gibi const dizeleri sınıfları kullandı neyi
herhangi bir şekilde,:
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;
}
}
Cons - kadar basit olabilir.
Downsides - gevşek tip denetimi (programlı olarak zorlanabilir olsa da).
Bu sefer daha iddialı bir şey düşünmeye çalıştım. Bu yüzden, Brian tarafından tanımlanan kavramı aldım (örneğin, belirli bir enum'un alan genelinde yaygın olarak kullanıldığı zaman bazı olumsuzlukları vardır).
bir temel bileşeni sınıf değerlerini saklamak için: Ve de .. ben şu çalışma var
[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 jenerik türlerini desteklemez hariç .. temelde yeterli olacaktır .. .
Bu gibi bir şey olması gerekir her enum için anlamı ... size kolayca örneğin oluşturulabilir olabilecek bazı kazan-plaka verir
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 şablonları kullanarak.
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
Ama yerinde örtük dönüştürme beri, sınıf bildirimleri sadece onlar yardımcı türlerinden haberdar olmak şunlardır: nihayet kullanarak size biter
.
Numaralandırma statik bir nesnedir, veritabanına kaydetmenin bir anlamı yoktur ... Gerçekten de veritabanındaki öğeleri tanımlamanız ve ardından kodunuzu bir T4 şablonu kullanarak kodlamanız gerekir. –
Bir enum değeri _is_ an int. Bunu gerçekten kaydetmelisin. DB bir dize olarak sahip olmak için bir _very good_ sebebi yoksa .. Hangi sanırım yok. –
@ Pierre-LucPineault: bir int olarak depolamak tehlikeli değil mi? Herkesin yapması gereken, enum'u yeniden sipariş etmemesi ve hemen veritabanınızdaki tüm değerlerin herhangi bir uyarıda bulunmadan yanlış numaraya işaret etmesidir. – Diskdrive