实体框架枚举和字符串关联



我想使用本文中的方法为我的枚举类型实现更友好的 ToString() 输出。我想知道如何在实体框架自动生成的枚举代码中完成此操作?我是否必须修改代码生成模板(如果是这样,有人可以给我一些指导,因为模板相当复杂),或者有人可以建议另一种方法吗?

谢谢!

可以在 EF 模型中使用自己的枚举类型,而不是在模型设计器中创建新的枚举。方法如下:

在模型设计器中,单击曲面并选择:

添加新的 -> 枚举类型...

在对话框中,只需设置复选框:

引用外部类型

,然后输入您的类型:namespace.MyEnum

然后在表中创建列以使用此类型。

由于你可能会修改现有模型,因此请确保模型中的枚举类型和代码中的(外部)枚举类型之间没有混淆。最佳方法是删除之前在模型中创建的枚举类型,并调整列以使用代码中的关联枚举类型。

现在,您可以按计划使用描述属性声明枚举类型。

您无需为枚举制定解决方法。它们在最新的实体框架中受支持。

为了使枚举对您的网站友好,您可以使用属性。下面是示例属性:

public class EnumDescription : Attribute
{
    public string Text { get; private set; }
    public EnumDescription(string text)
    {
        this.Text = text;
    }
}

使用属性标记枚举:

public enum DaylightSavingTime
{
    [EnumDescription("Detect automatically")]
    Auto = 0,
    [EnumDescription("DST always on")]
    AlwaysOn = 1,
    [EnumDescription("DST always off")]
    AlwaysOff = 2
}

添加扩展以启用ToDescription()方法:

public static class EnumExtensions
{
    public static string ToDescription(this Enum enumeration)
    {
        Type type = enumeration.GetType();
        MemberInfo[] memInfo = type.GetMember(enumeration.ToString());
        if (null != memInfo && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumDescription), false);
            if (null != attrs && attrs.Length > 0)
                return ((EnumDescription)attrs[0]).Text;
        }
        return enumeration.ToString();
    }
}

用法:

var blabla = DaylightSavingTime.Auto;
Console.WriteLine(blabla.ToDescription());

输出:

自动检测

最新更新