范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  在领域驱动设计(DDD)中,有一个非常重要的概念:"强类型Id"。使用强类型Id来做标识属性的类型会比用int、Guid等通用类型能带来更多的好处。比如有一个根据根据Id删除用户的方法的签名如下:void RemoveById(long id);
  我们从方法的参数看不出来id代表什么含义,因此如果我们错误地把货物的id传递给这个方法,那么也是可以的。这样用long等通用类型来表示标识属性会让参数等的业务属性弱化。
  而如果我们自定义一个UserId类型,如下:class UserId { public long Value{get;init;} public UserId(long value) { this.Value=value; } }
  这样User类的定义中Id属性的类型就从long变成了UserId类型,如下:class User { public UserId Id{get;} public string Name{get;set;} }
  对应的RemoveById方法的签名也变成了:void RemoveById(UserId id);
  这样不仅能一看就看出来id参数代表的业务含义,也能避免"把货物Id的值传递给用户Id参数"这样的问题。
  在.NET 6及之前,Entity Framework Core(简称EF Core)中很难优美地实现强类型Id。在.NET7中,EF Core中提供了对强类型Id的支持,具体用法请参考EF Core官方文档中"Value generation for DDD guarded types"这部分内容。
  尽管EF Core已经内置了对强类型Id的支持,但是它需要程序员编写非常多的代码。比如一个比较完善的强类型Id类的代码就要编写如下30多行代码:public readonly struct PersonId { public Guid Value { get; } public PersonId(Guid value) { Value = value; }  public override string ToString() { return Convert.ToString(Value); }  public override int GetHashCode() { return Value.GetHashCode(); }  public override bool Equals(object obj) { if (obj is PersonId) { PersonId objId = (PersonId)obj; return Value == objId.Value; } return base.Equals(obj); }  public static bool operator ==(PersonId c1, PersonId c2) { return c1.Equals(c2); }  public static bool operator !=(PersonId c1, PersonId c2) { return !c1.Equals(c2); } }
  还要编写一个ValueConverter类以及配置自定义的ValueGenerator……需要编写的代码的复杂程度让想使用强类型Id的开发者望而却步。
  正因为这一点,所以连微软的文档中都警告到"强类型Id会增加代码的复杂性,请谨慎使用"。幸好,这个世界有我!
  为了解决这个问题,我基于.NET的SourceGenerator技术编写了一个开源项目,这个开源项目会在编译时自动生成相关的代码,开发人员只要在实体类上标注一个[HasStronglyTypedId]即可。
  项目地址:https://github.com/yangzhongke/LessCode.EFCore.StronglyTypedId
  下面我用一个把所有代码都写到一个控制台项目中的例子来演示它的用法,多项目分层等更复杂的用法请见项目文档以及项目中的Examples文件夹中的内容。
  注意:这个项目可能会随着升级而用法有所变化,具体用法请以最新官方文档为准。
  用法:
  1、 新建一个.NET7控制台项目,然后依次安装如下这些Nuget包:LessCode.EFCore、LessCode.EFCore.StronglyTypedIdCommons、LessCode.EFCore.StronglyTypedIdGenerator。当然我们的项目要使用SQLServer以及使用EF core的migration,所以还要安装如下的Nuget包:Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools。
  2、 项目中新建一个实体类型Person[HasStronglyTypedId] class Person { public PersonId Id { get; set; } public string Name { get; set; } }
  我们注意到Person上标注的[HasStronglyTypedId(typeof(Guid))],它代表这个类启用强类型Id,编译器在编译的时候自动生成一个名字叫PersonId的类,所以我们就声明了一个名字叫Id、类型为PersonId的属性来表示实体的标识。
  PersonId在数据库中保存的默认是long类型,如果想保存为Guid类型,就可以写成[HasStronglyTypedId(typeof(Guid))]。
  编译一下项目,如果能够编译成功,我们反编译生成的dll,就能看到dll中自动生成了PersonId、PersonIdValueConverter两个类。
  3、 编写DbContext,代码如下:using LessCode.EFCore; class TestDbContext:DbContext { public DbSet Persons { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(自己的连接字符串); }  protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ConfigureStronglyTypedId(); }  protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { base.ConfigureConventions(configurationBuilder); configurationBuilder.ConfigureStronglyTypedIdConventions(this); } }
  4、 进行数据库的迁移等操作,这部分属于EF Core的标准操作,我不再介绍。对EF Core的用法不熟悉的朋友,请到哔哩哔哩、youtube等平台搜索"杨中科 .NET Core教程"。
  5、 编写代码进行测试
  using TestDbContext ctx = new TestDbContext(); Person p1 = new Person(); p1.Name = "yzk"; ctx.Persons.Add(p1); ctx.SaveChanges(); PersonId pId1 = p1.Id; Console.WriteLine(pId1);  Person? p2 = FindById(new PersonId(1)); Console.WriteLine(p2.Name);  Person? FindById(PersonId pid) { using TestDbContext ctx = new TestDbContext(); return ctx.Persons.SingleOrDefault(p => p.Id == pid); }
  强类型Id让我们能够更好的在EFCore中实现DDD,我开源的这个项目能够让开发者只要在实体类上标注一行[HasStronglyTypedId]就可以完成强类型Id的使用。希望它能够帮到你,欢迎把它分享到你所在的技术社区。

毕链科技积极推进基于BIM和web3的平台建设近日,毕链科技宣布将继续积极推进基于BIM和web3的平台建设,以实现全流程信息集成,为各类工程提供全方位的信息服务。据悉,毕链科技一直致力于互联网技术和BIM技术的结合,探索并推百姓严重犯罪的坚决判处死刑!贪官为什么不判死刑?3月8日上午,最人高民法刑院一庭长庭何莉,她两在会间期解读告报时声称对滥杀辜无报社复会因琐制事造灭门惨案等罪行其极严重,挑战律法和伦底理线犯的罪疑嫌人,该处判死刑的,坚决依判法处!原创超详细Python学习路线思维导图!多图预警,文末附PDF下载对当前各行业方向薪资状况,Python学习路线,Python核心知识做系统归纳!初识Python自1990年问世以来,Python逐渐逐渐走向大众视野,究其火的原因有几点首先是语法荣耀Magic5一天使用体验总结荣耀Magic5刚刚发布就入手了,现在说说这手机的优缺点荣耀magic5优点续航可以,现阶段可能没优化好,但续航也是很满足我了,早上拔电,上午上完班,下午去外面拍了半小时,流量wi600万辆库存,燃油车史诗级降价潮开启,新能源汽车却笑在了最后近日,湖北突然在燃油车领域撕开了一条口子,最高9万元的东风汽车补贴刷爆网络,一场史诗级降价潮就此拉开帷幕。据了解,目前至少有30个汽车品牌加入到降价阵列之中,其中最高补贴额度超过了植树节除了种树,还有分子育种南京溯远基因探索无尽的科学世界。随着科学技术的发展,基因检测技术作为农业科学研究中也发挥着不可替代的作用。农科领域也掀起了一股巨大的基因浪潮。基于Sanger测序的一代测序平台也广重庆南岸加快建设先进制造业强区阳春三月,重庆市南岸区春光明媚姹紫嫣红,处处涌动着高质量发展的勃勃生机。美心集团生产车间内一派繁忙景象,智能机器人有条不紊地完成门窗加工模具打磨等制造流程,叉车吊机穿梭往来,机器轰狗(苟)头碰撞测试GTA浪子疾风GT跑车碰撞测试哈喽大家好,我是游戏界最不严谨碰撞测试的狗头,在GTA游戏世界里有着很多的车,车辆质量尚且不知接下来我会一一测试。今天荣幸的邀请到(浪子疾速GT跑车)进行测试的是3辆浪子疾速原型车实现一批从0到1的原创性突破陕西夯实科技自立自强根基国家双一流建设高校8所,中央在陕科研院所30余家,国家(全国)重点实验室20余个,拥有包括72位两院院士在内的一大批高层次人才,数学物理化学生命地球科学体系健全陕西基础研究家底厚实权威解读为什么要组建国家数据局?作者卢爱芳来源科技资本论众所周知,今年两会通过的国务院机构改革方案中包括了组建国家数据局。对于大多数人来说,数据局是一个突然出现的全新概念。但事实上,国家数据局的组建是有迹可循的,从中兴通讯的2022年财报看,欧美市场的坑,国内市场补上了我们今天看一下中兴通讯这家公司2022年年度报告中有何值得一看的地方。对于这家知名度极高的公司,我们就不做介绍了。我们先看一下其专利的情况,截至2022年12月31日,中兴通讯拥有
美术专业的就业前景怎么样?大的数据统计网上有很多,这里就不说了。我说一下我的真实情况的,我是美术生,当时进入的是装潢设计,用现在的说法就是视觉传达专业,当时我们美术设计学院分为,环艺专业,广告设计专业,视觉马鞍山有什么本科大学?我们只说一些马鞍山本地的大学,不包含外地院校的分校。马鞍山的本科大学包含一本二本三本在内的有三所。其中一本院校只有一所,那就是安徽工业大学。安徽工业大学是一所理工性质的一本院校,这孩子该上三年级,想让孩子每天起来晨读半小时,主要是英语和语文方面,请问该读些什么?我先说一下,我的观点,我个人认为,三年级的孩子不要每天晨读半小时,这样是弊大于利。我想,我这样一说,应该会有很多人很不解,晨读,不是很好吗?为什么说这样做不好呢?有这么一句话,一年我孩子现在初二,数学只能考20几,其余的科目都能70以上,请问有望考高中吗?讲真,基本上没什么机会希望考高中了!己经初二了,时间上也来不及了!数学20多分说明基础非常差,可能就小学水平。别的70多分也处在中下等的水平!特别是数学,可以说你小孩初中的基本上是我们天天喊着支持国产,为什么苹果手机在中国销量依然这么好?感谢您的阅读!我们天天喊着国产手机,为什么苹果手机在国内的销量依然那么好?我们知道现在的苹果手机在全球的手机销量中表现非常的突出,而在国内手机销量中表现同样在前10。可以说消费者对为什么中国足球很难再次冲出亚洲?相比20年前的国足,现在是倒退了,20年前国是亚洲一二流的球队,而现在是四流球队了,因为什么?因为20年前的国足球员时代,国内消费水平和工资以及仁术员对比赛的态度和认识不一样了,当女排江苏队险胜天津队的原因?中国女排在哪些方面需要再提高?谢邀请!江苏女排赢在关键分打得更加果断全运会女排成年组第一轮比赛,江苏女排3比2战胜天津队,第五局更是在10比14落后的情况下逆转获胜,很多球迷疑惑,江苏女排为何在比分不利的情况下优秀项目经理停工放假后会安排下属做什么?谢悟空邀请不要说优秀的项目经理,就是一般的项目经理在停工以后都会安排项目相关人员做以下工作一对前段的施工进行预算,按照合同和施工进度,向甲方索要工程款,根据甲方付款数额,编制分配工在农村想当兵应具备什么条件?部队是锻炼和塑造人的最好去处,每个适龄青年都应该勇跃参加。既能履行法律义务,又能得到更好的锻炼,所以适龄青年应该积极参加祖国的挑选。今日头条悟空问答中提出在农村想当兵应具备什么样的三九将至,农村俗语三九开了河,农夫卖老婆,这是为什么呢?谢邀请!这个农村俗语不知从哪来的不清楚,就知道我们东北这地方从冬至的第一天起数九天为一九,九九八十一天。有谚语为证一九二九不出手,三九四九冰上走,五九六九开杨柳,七九河开,八九燕来如今骑摩托车的人还多吗?为什么?如今骑摩托车的人肯定少了,这里的原因有很多,但最主要的原因有以下几个。1。形势所迫,限行限油让很多摩友选择了新的交通工具,仅此一项原因让摩托车大军损失了一半的摩友。2。生活水平,随