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

我开发的开源项目,让。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的使用。希望它能够帮到你,欢迎把它分享到你所在的技术社区。

厉害!中国不断努力,打破欧美垄断的8个核心技术现在的中国对于美国来说已经是一个越来越强大的敌人,尤其是在这些年以来我国在遭遇欧美国家垄断的情况之下,还突破了许多项技术,其中就有我国对欧美垄断8个核心技术的打破。第一个火星探测器越南妹第一次去中国,慌了3次,以为被骗,老公是一个骗子哈哈我第一次去中国的,也是第一次我出国,那时候我以为我被骗了,我老公是个骗子啊,来越南骗我去中国,后来卖我到深山里,我这辈子也回不去越南,回不去见了我爸妈,我心里特别害怕,那事情是怎么中国又一旅游高铁即将开通!云南这个被遗忘的神仙之地,终于要火中国又一旅游高铁进入开通倒计时!它就是连接弥勒与蒙自的弥蒙高铁!弥蒙高铁位于云南红河州境内,全程107公里,北起南昆高铁弥勒站,向南途经弥勒市开远市止于红河州府蒙自市。8月24日,秦皇岛山海关软枣猕猴桃成熟上市冀时客户端报道(河北台张志刚赵永鑫通讯员马欣亚郑丽)初秋带来澄澈的诗意,也酝酿着丰收的喜悦。眼下,正值软枣猕猴桃成熟季,秦皇岛市山海关区石河镇五里台村的软枣猕猴桃也迎来了大丰收。走国家宣布10月底前尽量减少跨地市出行,今年黄金周怎么办?去年国庆,全国跨省旅游火爆,当时疫情实际在我国已经得到了极大控制,普罗大众可以自由活动,基本无拘无束。为了避开黄金周人从众,当时专门安排在国庆节黄金周最后两天才出游,确实也避开了规老话讲男不入川女不入藏老不入广,为啥这3个地方不能去在漫漫历史长河中,有很多关于旅游的记载,不论是哥伦布,还是徐霞客,他们都带着一颗游览美好山河的心,只不过对于未知的美好,他们有着不一样的处理方式罢了。纵观华夏五千年文化历史,旅游达相约大圣故里展示港城文化第四季两岸大V跟着诗词走江苏活动落幕打卡江苏最高峰玉女峰(图片来源江苏省台办)中国台湾网9月9日讯日前,第四季两岸大V跟着诗词走江苏活动在连云港市落下帷幕。在为期4天的时间里,6位来自海峡两岸的历史文化大V,相约大圣河南第一人工湖,白沙湖,传说可以抓住晚霞,这里实在是太美了自从古代开始,人们为了方便资源的调动,便启动了南水北调的工程政策。将南方大量的水资源运输到了北方,解决了北方缺水的问题。而河南作为南方和北方的一个交界处,在这里建设了大量的人工湖和他跳入大海救人,他忍耐高温保障航行一群摆渡人让旅途充满温度新海南客户端南海网南国都市报记者贺立樊实习生柳雨杉2015年1月23日上午伴随阵阵汽笛声海棠湾轮载着763名旅客驶离海口秀英港朝海峡北岸驶去这是它的首航也是它从此日复一日的航路海棠吾心安处是黄山来源人民网人民日报海外版黄山关麓帐篷客度假酒店。五岳归来不看山,黄山归来不看岳,自大学毕业之后,我已3次游览黄山,因其多重魅力,每次都有新体验。我最早与黄山结缘,是源自大学时喜欢看湖南道县旅游景点有哪些?有这12个地方,给你不一样的旅游体验道县旅游景点有1韭菜岭,徒步露营最佳地2道县月岩,形如半月的溶洞3周敦颐广场,观周敦颐的巨型雕像4道县烈士纪念馆,红色旅游地5葫芦岩红军渡,湘江战役第一渡口6湘源温泉,低硫温泉7濂
观影记澳门风云上个周末在家看了一部2014年上映的香港赌片澳门风云,导演是擅长拍商业娱乐题材的王晶。香港的赌片多年来一直都是换汤不换药,情节模式化,先是渲染主角玄乎其技的赌博才能,掀起第一个高潮恭喜!香港知名女星突然宣布怀孕,丈夫努力戒烟戒酒改善精子质量本文编辑剧透社issac未经授权严禁转载,发现抄袭者将进行全网投诉恭喜,恭喜!据港媒最新报道,现年35岁的香港知名女星江若琳,透过社交媒体突然宣布怀孕喜讯。据了解,最近也是江若琳和whatsapp筛选性别有什么用?做过whatsapp营销的小伙伴都知道,whatsapp是手机号注册的,只要知道手机号,那么就可以直接发送消息给用户,不需要像微信一样还要添加好友成功才可以交流,且whatsapp加密行业2022年度大事盘点还有不到10天我们就要彻底告别2022年,在这一年里,随着牛市的消退和价格的暴跌整个加密行业发生了翻天覆地的变化。因此在做年度盘点时我们需要涉及过年一年行业里的方方面面。此篇文章将诺亦腾十周年十年前的今天,诺亦腾成立。那个时候,世界沉浸在乔布斯留下的科技与人文遗产中。人之所以会活在世界上,一定就是为了去改变世界,刚成立的诺亦腾鲜衣怒马意气风发,定下自己的目标用动作捕捉技物理界会出现另一个爱因斯坦或牛顿吗?(全文约5000字,看完需要5分钟)在所有科学领域,没有比爱因斯坦和牛顿更能改变世界的人物了。会有人再次成为像爱因斯坦或牛顿那样的革命者吗?可能永远不会有另一个爱因斯坦或另一个牛顿问题来了,什么时候可以看到真全面屏手机呢?屏下摄像头怎么还不出新机呀?有没有真全面屏手机推荐呀?这手机要是换成屏下我必买。讲真,每次和大家聊新机,基本上都能看到类似的评论。看来,对于一块完整无缺口的屏幕,消费者始终都保持着年底拆车谁家更强?星越LHi。P实力证明三车实力角逐,看完AutoLab近期进行的一拆到底,Lab测试新能源车贺岁大横评!拆车测试,最终见分晓。我们发现星越LHi。P比唐DMi更安全,三电比问界更优秀。下面,就来看看细节敲重点,如何正确认识网络抓取与网络爬取网络抓取是个复杂的概念,从它的定义到它在商业中的应用,以及它对未来商业领域的巨大影响来看,都能体会到这一点。当然,还有另一个常见术语,网络爬取。您可能听到有人将这两个术语混为一谈。关于降本增效,腾讯这次可能不是说说而已据界面新闻报道,12月15日,腾讯在线上召开了内部员工大会,约有100余名员工参与到此次会议中,而今年大会的主题,是降本增效。从2022年年初,降本增效这一概念在游戏圈开始被频繁提邬贺铨院士让5G更适于工业互联网,科学规划和使用频段是第一步如何让5G设备更适用于工业场景中?12月20日,中国工程院院士邬贺铨在中国无线电大会上,从工业互联网中5G专网主要设备的改进,到频率利用的优化等多个方面,提出了自己的建议。工业5G