【问题标题】:Entity Framework Enum and string association实体框架枚举和字符串关联
【发布时间】:2014-01-13 05:55:30
【问题描述】:

我想使用this article 中的方法为我的枚举类型实现更友好的 ToString() 输出。我想知道如何在 Entity Framework 的自动生成的枚举代码中做到这一点?我是否需要修改代码生成模板(如果是这样,由于模板相当复杂,有人可以给我一些指导吗),或者有人可以提出替代方法吗?

谢谢!

【问题讨论】:

  • “自动生成的枚举代码”是什么意思?您是在谈论使用“模型/数据库优先”的方法吗?
  • 这涵盖了对 EF 数据库第一方法的枚举支持:stackoverflow.com/questions/17731557/… 查看替代答案以及其他链接。
  • @Floremin:是的,我首先使用模型。所以我的整个模型都是通过设计师完成的,包括我的枚举类型。因此,包含枚举声明的类由 EF 的 T4 自动生成。现在的问题是,由于枚举类型的命名受限,我的枚举很难在我的 ASP.net 网站中使用,我链接的文章中准确描述了该场景,其中作者使用 DescriptionAttribute(反射)来解决问题。我不认为这可以在 EF 中完成,尽管无需对 T4 模板进行大量修改,因为代码是自动生成的?

标签: c# entity-framework entity-framework-6


【解决方案1】:

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

在模型设计器中,右击表面并选择:

新增 -> 枚举类型...

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

引用外部类型

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

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

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

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

【讨论】:

  • 非常感谢您指出我一直忽略的外部参考选项。我试过这个,它似乎工作得很好。 EF 的设计者仍然可以通过这种方式访问​​新的枚举类型,这意味着它们可以轻松地用作我的实体的属性类型(无需在数据库上手动设置任何内容)。我很满意。
【解决方案2】:

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

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

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());

输出:

自动检测

【讨论】:

  • 是的,我知道它受支持并且我已经在使用它。我的问题是由于枚举的命名限制(例如,一个成员只能命名为NewYork,而不是New York),我的枚举类型很难在我的asp.net网站中使用(如我链接的那篇文章中所述) .
  • @user3144721,我已经更新了答案(如果你喜欢,请投票)
  • 感谢您的回复,尽管我确实在我的原始帖子中链接了描述此问题的文章(使用属性作为友好枚举名称)。我的问题是,使用 EF 的模型设计器,枚举声明是自动生成的且不可编辑(对自动生成的类文件的任何修改都将在模型更新时被覆盖),因此我无法添加属性。如果我想在设计时完成这项工作,Floremin 的方法(在外部编写枚举)似乎是我唯一的选择。
  • 我还意识到您提出的扩展方法方法是一个好主意(而不是使用我阅读的文章中显示的常规静态方法,我将遵循该方法)。现在我将在外部定义的枚举类型中使用扩展方法。两全其美。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多