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

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

在国企工作真的是铁饭碗吗?看似国企真的是铁饭碗,但是如果未来某一天,碗里没有饭了,可你依然只有碗,你仍然会饿死。所以饭碗铁不铁,关键在于碗里有没有饭。我在国企中工作了5年,曾经我也一度认为这辈子不会去学写简老人的退休金,直接影响了一家人的生活质量,这话是谬论吗?我老爸老妈的退休金加养老金每月7200元,我弟两口子根本不用管我爸我妈的生活,自己的工资随心所欲地花,到年底还会收到来自父母5万元的大红包。我小弟家的日子是我们姐弟三人中过的最舒坦男朋友沪籍,我非沪籍,还没领证,上海新房产证上可以写男女双方的名字吗?作为一个适婚孩子的家长我想说一句别先考虑房产证上加不加名字,而是应该考虑以后怎样好好地过日子。该你的一分也不会少,不该你的加个名字也没鸟用。您好!先简单界定一下题主非沪籍,理解为题有什么事情是你去了西宁才知道的?1。到了西宁,才知道青海并不是青岛2。到了西宁,才知道这里的人并不是天天骑马上班3。到了西宁,才知道这里的物价跟一线城市不相上下4。到了西宁,才知道这里的天空真的很美5。到了西宁,厦门市为什么取消购房入户?因为厦门城市很小,特别是岛内,只有158平方公里,现在的常住人口已经趋于饱和,每年进入厦门的人口还在不断增加,如果不控制,继续增加下去,整个城市的公共设施承载不了,公共服务也跟不上滇中8条环线高速建成后,会带动云南哪些地区的经济发展?滇中环线高速的修建,是为了更好更快地推动滇中城市经济圈的发展。在8条计划修建的环线高速中,曲陆高速沾会高速武易高速三条已经建成通车,这三条线路建成后大大缩短了高速两地之间的车程和时打工是不是长久之计?你怎么看?打工是普通人大众化维持生活的一种基本方式,也是经济收入的主要来源。不可能都去当老板,那就不存在打工一说。学手艺照样是给别人做事,不同的是自己说了算。要想改变命运,改变自己的生活方式甘肃ampquot带母上学ampquot残疾考生入住清华。你觉得校方回应的无特殊待遇合理吗?制度是程序化,特殊处理是人情化。不能因为人情世故而放开制度的束缚,不过按照国情父爱主义的主张,给这个学生网开一面是一种人文教育的社会学重要课程,它反而引起更好的正激励。至于不同的声深圳哪条地铁线通大亚湾?深圳地铁16号线和14号线通大亚湾和惠阳。目前,这两条线路都已开建,预计2022年底建成。先来看看深圳这两条地铁线的走向。深圳地铁16号线16号线线路起于龙岗大运站,串联龙岗大运中烟台一中学区房还会涨吗?首先我反对这样的教育资源倾斜,但是没办法现实就这样,一中学区从去年的最低13000左右,去年年底已经涨到了2500030000,几乎翻翻,越是小户型越高,但是最近两个月已经开始逐渐桂林有地铁吗?背景桂林没有地铁,但是桂林有8一辆国内自主生产的云轨列车,亮相桂林市甲天下广场8月25日,这辆云轨展示车将向市民全面开放展示市民还有机会进入内部参观哦云轨在桂林甲天下广场展出云轨云
广汽蔚来的蜕变,合创汽车MPV曝光,或将广州车展发布?面对汽车多元化的今天,全新汽车品牌的频繁推出可谓是让我们应接不暇。合创汽车对于很多用户而言想必是非常陌生,其前身为广汽蔚来,后续股权变更以及蔚来汽车的退出,去年四月更名为合创汽车科不想追着娃喂饭,这1招要赶快学!有平底锅就能做,这搭配我能打满分如果你们家孩子吃饭费劲,每次都得追着喂。那我觉得这种手指食物的比例,一定要给它增加!你们就试一下我这种烫面的做法,面皮薄软还更有韧性。如果没有时间,还能用现成的馄饨皮儿包,稍微擀薄太阳酋长太阳酋长说炽热的胸膛在咆啸醒来吧看星光灿烂羊群在草原上游走明媚春天闪耀人性光辉不能像蜗牛缓慢爬行不羡慕悠闲与淡定精神之光涌动着生命无限可能眼睛闪亮了口中发出刚毅的声音蜷缩一角的兄弟NBA交易市场再掀波澜,马刺爵士开张不打折,太阳志在最后一搏杜兰特布鲁克林篮网休赛期承包了联盟大部分流量,在赢得大众瞩目之后,篮网成功将凯里欧文和凯文杜兰特留在了新赛季的阵容之中。篮网在这场风波中的处理堪称教科书级别,蔡崇信和他的管理团队成登炮组合有望重聚!76人太阳交易方案曝光,总冠军稳了?重磅消息!唯一能带队和五星宇宙勇打到抢七的登炮组合很可能要重聚了,这个消息太疯狂了,估计恩比德要懵圈了,真把18年的火箭搬过来了?是不是真的该改名叫作费城火箭队了?这到底是谁的球队凯特出席葬礼再戴女王珠宝,双重致敬祖父母,梅根保持优雅高冷风当地时间9月19日,已故英女王的葬礼在伦敦西的威斯敏斯特大教堂隆重举行。国王查尔斯三世和妻子卡米拉王后带领弟妹(安妮公主和蒂莫西劳伦斯爵士安德鲁王子和爱德华王子和索菲威塞克斯伯爵夫或将物价上涨,人民币汇率破7意味着什么,对百姓有什么影响首先人民币跌破7元,虽然这也不是什么令人惊奇的事,毕竟人民币和美元汇率也出现好几次破7,但是或多或少都会有一定的影响。对于股市来说,这显然不是一个好消息,人民币的下跌,意味着更少的各大银行都降息了,这对老百姓的生活有什么影响?答案来了9月15日,工行农行中行建行交行邮储这六大国有银行和招商银行的存款挂牌利率都悉数下调。16日,中信银行光大银行民生银行平安银行浦发银行广发银行等银行发布公告,宣布下调定期存款利率。减产!两家全球汽车巨头同时宣布见习记者王佳霖本田和丰田两大车企同时宣布减产。9月22日,丰田官网公布了10月生产计划。计划显示,受半导体短缺的影响,丰田将10月份全球计划产量下调至80万辆左右,较原计划降低了1想获得幸福成功的人生,除了拥有才华,你可能还需要钝感力钝感虽然有时给人以迟钝木纳的负面印象,但钝感力却是我们赢得美好生活的手段和智慧。渡边纯一每个人都想获得幸福成功的人生,然而这对于很多人来说,就是一个遥不可及的梦想。关于幸福和成功,稳经济及时雨继续下国务院连派三批工作组原标题及时雨继续下!国务院连派三批特殊工作组稳经济及时雨继续下!在稳经济顶风爬坡的关口,中国推出督导和服务的创新举措,在派两批工作组赴16个省份开展督导和服务后,近日又派出第三批工