我的数据库中的字符串值被限制为一组固定值,例如:
REGISTERED
PENDING
BANNED
目前我使用常量来表示这个值,但我更愿意使用enum
。
我正在使用 EF 6,我相信它支持 enum
,但我可以使用枚举并将其作为大写字符串表示形式保存到数据库吗?
public enum RegistrationStatus
{
REGISTERED,
BANNED,
PENDING
}
最佳答案
我很抱歉,这将是这么多代码,但您可以创建一个基于字符串的类型安全枚举,并且证明它工作的唯一方法是提供一个工作示例。
类
public sealed class Frequency : IEnumeration, IComparable
我们在 POCO 中声明为
public Frequency chargeFrequency { get; set; }
在映射文件中是这样的——注意我们映射到 Frequency
类的 value
属性
this.Property(t => t.chargeFrequency.Value)
.HasColumnName("chargeFrequency")
.HasColumnType("varchar")
.IsOptional()
.HasMaxLength(25);
这是一种享受。
x.chargeFrequency = Frequency.Annually
唯一的缺点是 intellisense 无法为我们计算出来。
类的静态部分
private static readonly Dictionary<string, Frequency> _list =
new Dictionary<string, Frequency>();
public static bool Contains(string key)
{
return _list.Any(x => x.Key == key);
}
public static bool operator !=(Frequency a, Frequency b)
{
return (!a.Equals(b));
}
public static bool operator ==(Frequency a, Frequency b)
{
return (a.Equals(b));
}
public static implicit operator Frequency(string value)
{
if (value == null || value.Trim().Length == 0) return Frequency.Null;
if (Contains(value))
return _list[value];
else
throw new InvalidCastException(string.Format("Frequency.{0} not found.", value));
}
public static implicit operator String(Frequency item)
{
return item.Value;
}
public static readonly Frequency Null = new Frequency("");
public static readonly Frequency Annually = new Frequency("Annually");
public static readonly Frequency Fortnightly = new Frequency("Fortnightly");
public static readonly Frequency FourWeekly = new Frequency("FourWeekly");
public static readonly Frequency HalfYearly = new Frequency("HalfYearly");
public static readonly Frequency Monthly = new Frequency("Monthly");
public static readonly Frequency Quarterly = new Frequency("Quarterly");
类的实例部分
private readonly string _value;
private readonly bool _readonly;
private Frequency _instance;
private Frequency(string value)
{
_readonly = true;
_value = value;
_instance = this;
_list[value] = _instance;
}
public Frequency()
{
_readonly = false;
_instance = Frequency.Null;
}
[XmlText]
public string Value
{
get
{
if (_instance == Frequency.Null) return null;
return _instance._value;
}
set
{
if (_readonly)
throw new InvalidOperationException("Cannot assign a value to an enumeration.");
if (value == null) _instance = Frequency.Null;
else
{
if (!_list.ContainsKey(value))
throw new NullReferenceException(string.Format("Frequency.{0} not found.", value));
_instance = _list[value];
}
}
}
public override string ToString()
{
return Value;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() != obj.GetType()) return false;
// safe because of the GetType check
Frequency item = (Frequency)obj;
return System.Object.ReferenceEquals(_instance, item);
}
public override int GetHashCode()
{
if (_value == null) return "".GetHashCode();
else return _value.GetHashCode();
}
public int CompareTo(object obj)
{
if (obj is Frequency)
{
if (_value == null)
{
if (obj == null) return 0;
else return -1;
}
Frequency compare = (Frequency)obj;
return _instance.Value.CompareTo(compare.Value);
}
else
throw new ArgumentException("Object is not a Frequency.");
}
关于c# - 使用 Entity Framework 对字段使用枚举,但使用 ToString 值而不是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620672/