EF中如何优雅地将枚举类型对应到数据库int类型

iAm_Ike 2019-08-30 01:37:06
需求是这样的,数据库的菜单表中有一个int类型的菜单字段MenuType,分为两个,前台菜单1和后台菜单2,使用EF的时候,直接定义一个int MenuType,可以直接取到int类型值,但是这样写代码的时候直接操作int类型会分不清哪个int对应哪个类型,所以写了一个枚举类来进行转换,看着也很方便。如下:

public class Menus
{
public string MenuName { get; set; }
public string MenuUrl { get; set; }
public string MenuIcon { get; set; }
public int MenuType { get; set; }
[NotMapped]
public EnumMenuType EnumMenuType
{
get
{
return (EnumMenuType)(MenuType);
}
set
{
MenuType = (int)value;
}
}
}
public enum EnumMenuType
{
前台菜单=1,
后台菜单=2
}


这样的话,每次修改菜单的类型,可以直接通过枚举类型EnumMenuType进行读写,枚举类型可读性也比直接用int直观,但是目前这样设计,MenuType字段还是暴露出去了,外界可以直接修改MenuType字段而不用通过EnumMenuType。

现在就是希望仅仅只能通过EnumMenuType来修改MenuType,我试着把MenuType改为private,但是修改之后这个字段就没法从数据库那边读过来,EF对这个字段的映射就会失效。

所以请教一下这个怎么设计比较合理。
...全文
838 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iAm_Ike 2019-08-30
  • 打赏
  • 举报
回复
如果需要解决上述的返回到前端时枚举被转为int的问题也很简单,有以下两种方法, 第一种是在需要转换的model里添加特征,这个特征需要引用Newtonsoft.Json,如下: 这样的话,这个字段返回到前端时就会变成enum的string类型, 如果你有很多字段需要这样操作,也可以直接在更底层的startup.cs里做一个统一的配置,这样的话在model层里只要是enum类型,没有特征也会被转换,配置如下: 最后两个配置方法都可以返回如下结果,int类型被转换成enum的string 描述返回到前端结果中。
iAm_Ike 2019-08-30
  • 打赏
  • 举报
回复
好的,结贴了,楼上两位说的都可以。 另外需要注意一下,如果是api,把查询结果返回到前端中,前端的值还是int类型的,看下面两张图,如果需要把enum转成string的话,就在查询之后再多select一个字段出来吧。
冰川711 2019-08-30
  • 打赏
  • 举报
回复
public EnumMenuType MenuType { get; set; } 直接这样就可以了, 不用加个字段~ 枚举就是int 型
正怒月神 2019-08-30
  • 打赏
  • 举报
回复
我记得是可以直接使用枚举类型的。 https://www.cnblogs.com/xuxin-1989/p/4515633.html

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧