关于CodeFrist下EntityFramework5.0及其最新版本中枚举的使用
早期使用EntityFramework的Coder应该知道5.0之前的版本是未对枚举进行支持的。不论是ModelFrist还是CodeFrist
在CodeFrist模式下一般是使用第三方解决方案,例如下面的方式虽然解决,但是在Model的声明和View的使用上都比较混乱
Enum
public enum PermissionTypeEnum { [Description( "页面类" )] 页面类, [Description( "操作类" )] 操作类 } |
Model
public PermissionTypeEnum PermissionTypeEnum { get ; set ; } [Display(Name = "权限类型" )] public int PermissionType { get { return ( int )PermissionTypeEnum; } set { PermissionTypeEnum = (PermissionTypeEnum)value; } } |
EF在5.0之后就已经对枚举进行支持了,当然使用上也很简单。在官方adonet博客上有介绍
http://blogs.msdn.com/b/adonet/archive/2011/06/30/walkthrough-enums-june-ctp.aspx
DBFrist的比较简单,就不说了。在这里分享一下如何在CodeFrist下的用法,希望对大家能有帮助
Model变的更简洁
[Display(Name = "权限类型" )] public PermissionTypeEnum PermissionType { get ; set ; } |
View的Create Or Edit代码修改成如下,List不变
@Html.EnumDropDownListFor(model => model.PermissionType) |
效果如下
View用到的扩展方法:

private static Type GetNonNullableModelType(ModelMetadata modelMetadata) { Type realModelType = modelMetadata.ModelType; Type underlyingType = Nullable.GetUnderlyingType(realModelType); if (underlyingType != null) { realModelType = underlyingType; } return realModelType; } private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "请选择...", Value = "" } }; public static string GetEnumDescription<TEnum>(TEnum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if ((attributes != null) && (attributes.Length > 0)) return attributes[0].Description; else return value.ToString(); } public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression) { return EnumDropDownListFor(htmlHelper, expression, null); } public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); Type enumType = GetNonNullableModelType(metadata); IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>(); IEnumerable<SelectListItem> items = from value in values select new SelectListItem { Text = GetEnumDescription(value), Value = value.ToString(), Selected = value.Equals(metadata.Model) }; // If the enum is nullable, add an 'empty' item to the collection if (metadata.IsNullableValueType) items = SingleEmptyItem.Concat(items); return htmlHelper.DropDownListFor(expression, items, htmlAttributes); }
分类:
Entity Framework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2011-04-27 测试SQL语句执行时间