c# - 使用 Entity Framework 对字段使用枚举,但使用 ToString 值而不是整数

标签 c# entity-framework enumeration

我的数据库中的字符串值被限制为一组固定值,例如:

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/

相关文章:

c# - 判断 double/float/int/short/byte 的字符串是否超出范围

c# - linq 中的虚拟(预定义)列分组

c# - 使用 Ionic2-Angular2 前端和 ASP.NET 核心后端创建应用程序?

c# - Entity Framework 存储过程异常

scala - Scala 中具有迭代的丰富枚举

c# - TreeView 项目序列化

c# - Linq To 实体查询返回错误数据(不同于 Management Studio 查询)

c# - 使用 2 个 DBContext 开始事务

c# - '集合已修改;使用 async/await 可能无法执行枚举操作

arrays - 对结构数组 [Array][Struct] 的数组进行排序