城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

我开发的开源项目,让。NET7中的EFCore更轻松地使用强

11月15日 颜如初投稿
  在领域驱动设计(DDD)中,有一个非常重要的概念:强类型Id。使用强类型Id来做标识属性的类型会比用int、Guid等通用类型能带来更多的好处。比如有一个根据根据Id删除用户的方法的签名如下:voidRemoveById(longid);
  我们从方法的参数看不出来id代表什么含义,因此如果我们错误地把货物的id传递给这个方法,那么也是可以的。这样用long等通用类型来表示标识属性会让参数等的业务属性弱化。
  而如果我们自定义一个UserId类型,如下:classUserId{publiclongValue{}publicUserId(longvalue){this。V}}
  这样User类的定义中Id属性的类型就从long变成了UserId类型,如下:classUser{publicUserIdId{}publicstringName{}}
  对应的RemoveById方法的签名也变成了:voidRemoveById(UserIdid);
  这样不仅能一看就看出来id参数代表的业务含义,也能避免把货物Id的值传递给用户Id参数这样的问题。
  在。NET6及之前,EntityFrameworkCore(简称EFCore)中很难优美地实现强类型Id。在。NET7中,EFCore中提供了对强类型Id的支持,具体用法请参考EFCore官方文档中ValuegenerationforDDDguardedtypes这部分内容。
  尽管EFCore已经内置了对强类型Id的支持,但是它需要程序员编写非常多的代码。比如一个比较完善的强类型Id类的代码就要编写如下30多行代码:publicreadonlystructPersonId{publicGuidValue{}publicPersonId(Guidvalue){V}publicoverridestringToString(){returnConvert。ToString(Value);}publicoverrideintGetHashCode(){returnValue。GetHashCode();}publicoverrideboolEquals(objectobj){if(objisPersonId){PersonIdobjId(PersonId)returnValueobjId。V}returnbase。Equals(obj);}publicstaticbooloperator(PersonIdc1,PersonIdc2){returnc1。Equals(c2);}publicstaticbooloperator!(PersonIdc1,PersonIdc2){return!c1。Equals(c2);}}
  还要编写一个ValueConverter类以及配置自定义的ValueGenerator需要编写的代码的复杂程度让想使用强类型Id的开发者望而却步。
  正因为这一点,所以连微软的文档中都警告到强类型Id会增加代码的复杂性,请谨慎使用。幸好,这个世界有我!
  为了解决这个问题,我基于。NET的SourceGenerator技术编写了一个开源项目,这个开源项目会在编译时自动生成相关的代码,开发人员只要在实体类上标注一个〔HasStronglyTypedId〕即可。
  项目地址:https:github。comyangzhongkeLessCode。EFCore。StronglyTypedId
  下面我用一个把所有代码都写到一个控制台项目中的例子来演示它的用法,多项目分层等更复杂的用法请见项目文档以及项目中的Examples文件夹中的内容。
  注意:这个项目可能会随着升级而用法有所变化,具体用法请以最新官方文档为准。
  用法:
  1、新建一个。NET7控制台项目,然后依次安装如下这些Nuget包:LessCode。EFCore、LessCode。EFCore。StronglyTypedIdCommons、LessCode。EFCore。StronglyTypedIdGenerator。当然我们的项目要使用SQLServer以及使用EFcore的migration,所以还要安装如下的Nuget包:Microsoft。EntityFrameworkCore。SqlServer、Microsoft。EntityFrameworkCore。Tools。
  2、项目中新建一个实体类型Person〔HasStronglyTypedId〕classPerson{publicPersonIdId{}publicstringName{}}
  我们注意到Person上标注的〔HasStronglyTypedId(typeof(Guid))〕,它代表这个类启用强类型Id,编译器在编译的时候自动生成一个名字叫PersonId的类,所以我们就声明了一个名字叫Id、类型为PersonId的属性来表示实体的标识。
  PersonId在数据库中保存的默认是long类型,如果想保存为Guid类型,就可以写成〔HasStronglyTypedId(typeof(Guid))〕。
  编译一下项目,如果能够编译成功,我们反编译生成的dll,就能看到dll中自动生成了PersonId、PersonIdValueConverter两个类。
  3、编写DbContext,代码如下:usingLessCode。EFCclassTestDbContext:DbContext{publicDbSetPersonPersons{}protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){optionsBuilder。UseSqlServer(自己的连接字符串);}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){base。OnModelCreating(modelBuilder);modelBuilder。ConfigureStronglyTypedId();}protectedoverridevoidConfigureConventions(ModelConfigurationBuilderconfigurationBuilder){base。ConfigureConventions(configurationBuilder);configurationBuilder。ConfigureStronglyTypedIdConventions(this);}}
  4、进行数据库的迁移等操作,这部分属于EFCore的标准操作,我不再介绍。对EFCore的用法不熟悉的朋友,请到哔哩哔哩、youtube等平台搜索杨中科。NETCore教程。
  5、编写代码进行测试
  usingTestDbContextctxnewTestDbContext();Personp1newPerson();p1。Nctx。Persons。Add(p1);ctx。SaveChanges();PersonIdpId1p1。Id;Console。WriteLine(pId1);Person?p2FindById(newPersonId(1));Console。WriteLine(p2。Name);Person?FindById(PersonIdpid){usingTestDbContextctxnewTestDbContext();returnctx。Persons。SingleOrDefault(pp。Idpid);}
  强类型Id让我们能够更好的在EFCore中实现DDD,我开源的这个项目能够让开发者只要在实体类上标注一行〔HasStronglyTypedId〕就可以完成强类型Id的使用。希望它能够帮到你,欢迎把它分享到你所在的技术社区。
投诉 评论 转载

苹果凭借第二代AirPodsPro,占据30。9市场份额随着时间逐渐推进,最近一段时间关于第三季度的市场调查报告正在陆续公布。其中,除了竞争激烈的智能手机市场外,智能个人音频市场的表现也令人关注。近日,调研机构Canalys公……笑到喷饭的穿帮镜头,关晓彤忍了,看了刘亦菲太心疼,导演你来!搞笑一刻现在的电视剧出片率很高,从剧本、表演到后期制作都非常用心,但总还是会有一些漏网之鱼,成就了一些经典的穿帮镜头。下面就让我们一起去回顾一下电视剧中的穿帮镜头,乐呵一……小卡轰3394仍无缘今日最佳!对不起,你碰到NBA奇迹了北京时间1月11日,NBA常规赛继续进行,联盟今天共安排了7组对决,小卡、哈登、克拉克森、西亚卡姆、布里奇斯、小瓦格纳等球星都有不俗的表现。比如快船队的小卡,在快船队击败独行侠……这届球迷在虚拟世界为阿根廷助威PICOVR看球成今年世界杯潮19日01时55分,随着蒙特尔最后一枚点球的射入,阿根廷队夺得2022卡塔尔世界杯总冠军,为期28天、累计64场比赛的2022年卡塔尔世界杯落下了帷幕。这届世界杯有太多的冷门也……山西阳城山茱萸王长势旺【来源:山西省林业和草原局媒体聚焦】山西省晋城市阳城县是我国山茱萸主产区之一,蟒河镇蟒河村蟒河自然风景区内生长着一片山茱萸古树群,树龄在100500年之间,共158棵,仍……张天爱的身材爱了!果然美女什么风格都能驾驭,曲线太吸睛最新一期的《乐队的海边》里,迎来了第一次乐队演出,张天爱和于文文合作《mojito》让粉丝期盼已久,海边夜色下,两人边弹边唱,台下观众享受其中,氛围轻松融洽。张天爱吊带搭……我开发的开源项目,让。NET7中的EFCore更轻松地使用强在领域驱动设计(DDD)中,有一个非常重要的概念:强类型Id。使用强类型Id来做标识属性的类型会比用int、Guid等通用类型能带来更多的好处。比如有一个根据根据Id删除用户的……魅族Flyme10曝光交互功能优化将与魅族19一起发布【手机中国新闻】自魅族加入吉利之后,有关魅族手机的消息变得愈发稀少。魅友们更是数度催促魅族,不要摆烂了,起来研发一下新机吧!虽然目前手机依旧了无音讯,但是手机中国了解到了魅族新……(体育)乒乓球WTT世界杯决赛王楚钦晋级决赛当日,在河南新乡举行的WTT世界杯决赛男子半决赛中,中国选手王楚钦以4比3战胜队友马龙,晋级决赛。10月29日,马龙在比赛中回球。新华社发(高志勇摄)10月29日,……首秀,绝杀!今晚凤凰山让成都球迷如痴如醉,连呼比看世界杯还过哇,这球场实在是太巴适了!12月23日晚,几乎每一位踏入凤凰山体育公园专业足球场的球迷都会发出这样的感慨。对于绝大多数人来说,这都是他们第一次与凤凰山专业足球场亲密接触今……隐藏在西安的大草原,秋天的景色媲美呼伦贝尔,又像极了锡林格勒无论你在西安的什么地方,未央区、长安区、雁塔区、灞桥区,或者在高陵区,都能方便地到达渭河南岸河堤路,一路向西,都是地阔人稀的渭河滩。说是大草原,确实有点夸张,但是长达10余公里……摊牌了?潘石屹夫妇正式宣布,人民日报说得很对在前不久,任正非的一则内部讲话在资本市场掀起了滔天巨浪。任正非表示,在全球经济衰退、消费能力下降的大环境下,华为应该改变思路,收缩和关闭边缘业务,从追求规模转向追求利润和现金流……
仅靠智能手环就能监测健康状况,是在瞎忽悠吗?柳叶刀地中海饮食预防心血管疾病复发和死亡的效果更好卫星拍到亚马孙雨林正在消失,中印却悄然变绿,专家都不是好事如果本山传媒解散,损失最大的,依旧是赵本山原神八重神子技能真假难辨?数个UP主和内鬼纷纷转发中国女排颜妮身高1米92,35岁至今单身,如今父母担心嫁不出暗黑破坏神不朽首次内容更新补丁一览,国外玩家怎么玩?我国14。1亿人,真正月入1万以上的人有多少?坝歪古树茶500亩茶园年产8吨鲜爽度达到5。45,接近冰岛老健脾益肺民间药方草参要交2亿奢侈税,勇士老板球员都是自己培养的,篮网湖人才该罚官方MVP榜最后一期约基奇蝉联榜首
中职电子电工教学的发展路径研究女人如何对症喝汤夜尿过频老人忌吃什么肉食科学衔接,携手同行惠州市名流幼儿园幼小衔接活动人民日报每日金句分享(2022。4。30)一千年以后小红书的进化与坚守心怀叵测的故事CBA詹姆斯李根现状,生涯赚5000万,已告别联赛,和美丽前一文揭秘深圳华强北二手手机批发市场为什么高血压脑中风的症状有哪些巴台农神庙(帕台农神庙的建造者)

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁