tha*_*ssd 3 c# entity-framework entity-framework-6
我想使用本文中的方法为我的枚举类型实现更友好的ToString()输出.我想知道在Entity Framework的自动生成的Enum代码中如何做到这一点?我是否必须修改代码生成模板(如果是这样,有人可以给我一些指导,因为模板相当复杂),或者有人可以提出替代方法吗?
谢谢!
您可以在EF模型中使用自己的枚举类型,而不是在模型设计器中创建新的枚举.这是如何做:
在模型设计师中,点击表面并选择:
添加新 - >枚举类型...
在对话框中,只需设置复选框:
参考外部类型
并输入您的类型: namespace.MyEnum
然后在表中创建列以使用此类型.
由于您可能要修改现有模型,因此请确保模型中的枚举类型与代码中的(外部)枚举类型之间没有混淆.最好的方法是删除先前在模型中创建的枚举类型,并调整列以使用代码中的关联枚举类型.
现在,您可以按计划声明具有描述属性的枚举类型.
您不需要为枚举制定解决方法。它们在最新的实体框架中受到支持。
为了使您的枚举对您的网站友好,您可以使用属性。这是示例属性:
public class EnumDescription : Attribute
{
public string Text { get; private set; }
public EnumDescription(string text)
{
this.Text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
用属性标记您的枚举:
public enum DaylightSavingTime
{
[EnumDescription("Detect automatically")]
Auto = 0,
[EnumDescription("DST always on")]
AlwaysOn = 1,
[EnumDescription("DST always off")]
AlwaysOff = 2
}
Run Code Online (Sandbox Code Playgroud)
添加扩展以启用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();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var blabla = DaylightSavingTime.Auto;
Console.WriteLine(blabla.ToDescription());
Run Code Online (Sandbox Code Playgroud)
输出:
自动检测