首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 C# 9 的records作为强类型ID - 初次使用

强类型ID 实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例。...幸运的是,可以定义强类型id来解决这个问题,这个想法很简单,为每个实体的ID声明一个特定的类型,现在需要这样写: // 使用强类型ID代替整数ID public void AddProductToOrder...a.Equals(b); } 上面的代码没什么难的,但是如果每个实体都需要的话,那确实有点麻烦,在C# 9 可以使用source generators来完成这些,但是C# 9还引入了另一个功能,使用起来更方便...使用record重写类型,就是下边这样: public record ProductId(int Value); 是的,您没看错,这是一行,而上面的代码是一大段,它完成了我们手动执行的所有操作(实际上,...现在为模型中的每个实体编写一个强类型的id是不是很简单,使用Record 非常方便,当然,还有其他问题需要考虑,例如JSON序列化,与Entity Framework Core一起使用等,但这是另一篇文章的故事

54820

JPA实体类有Id保存也会新增一条新的数据问题

还是遇见的问题太少。遇见的问题越多,知道的就会越多。 两个不同的实体类深拷贝,然后把id赋值回去更新,会出现一条新数据。...save方法的第一句代码就是判断entity是否是新增还是更新。...2.看isNew实现 第一个是AbstractPersistable提供的,也是我们熟知的 ,根据id是否为空来判断是否是更新 /** * Must be {@link Transient} in...wrapper.getPropertyValue(it.getName()) == null).orElse(true); } 这个是是根据version版本号来判断是否是更新,问题就出在这里,我们如果更新,必须更新实体的...总结:我一直在各种打印 id有木有赋值进去,刚开始是从对象里get出来的,后来又赋值给一个变量,然后怀疑jpa是不是直接拿自己的属性,而不是拿public方法(id是父类继承下来的),反正折腾了好久。

3.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    开源EFCore 对比实体与实际数据库结构的工具-GZY.EFCoreCompare

    读取代码中的 DbContext 及其 EntityType 实体定义。 对比两者的字段、表、主键、索引等内容。 检测并生成对应的报表 发现 数据库中有但代码中没有的表(可能需要删除)。...对比流程 获取数据库结构 使用 EF Core Scaffolding 解析数据库,并生成 DatabaseModel。...读取代码中的 DbContext 解析代码中的 DbContext 及其实体。 比对两者的差异 找出 表、字段、类型、索引、主键、外键 等方面的不同。...使用方式 1.直接使用 GZY.EFCoreCompare.Core 进行比对   直接在项目中通过Nuget引用GZY.EFCoreCompare.Core与对应数据库的驱动库,例:GZY.EFCoreCompare.MySql...集成图形化UI到项目中,进行持久化比对 在Web(MVC Raroz)或WebApi项目中通过Nuget引用GZY.EFCoreCompare.UI与对应的数据库驱动,例如:GZY.EFCoreCompare.MySql

    5610

    使用 C# 9 的records作为强类型ID - 路由和查询参数

    上一篇文章,我介绍了使用 C# 9 的record类型作为强类型id,非常简洁 public record ProductId(int Value); 但是在强类型id真正可用之前,还有一些问题需要解决...路由和查询字符串参数的模型绑定 假设我们有一个这样的实体: public record ProductId(int Value); public class Product { public...ProductId,由于它不是int,是我们定义的强类型ID,并且没有关联的类型转换器。...int) 我们的ProductId使用TypeConverter特性将该转换器与记录相关联: [TypeConverter(typeof(ProductIdConverter))] public record...; } } 到这里,我们可以直接删除之前的 ProductIdConvert, 现在有一个通用的可以使用,现在.NET Core 的路由匹配已经没有问题了,接下来的文章,我会介绍如何处理在JSON

    1.9K20

    Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查

    今天在使用数据库的时候,遇到一个场景,即在插入数据完成后需要返回此数据对应的自增主键id,但是在使用Mybatis中的generatedKey且确认各项配置均正确无误的情况下,每次插入成功后,返回的都是...1,而不是最新的自增Id。...终于凭借着一次Debugg发现的问题,原来在使用Mabatis中的insert或者insertSelective方式插入时,如使用int insert(TestGenKey testGenKey)时,返回值...int表示的是插入操作受影响的行数,而不是指的自增长id,那么返回的自增id到底去哪里了呢?...通过下面的Debugg我们知道自增id返回到testGenKey的原对象中去了。 举例示范配置 数据库示例表  generator的配置文件 <?

    1.7K10

    基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    聚合应该通过实现领域规则和规约来保持自身的完整性和有效性。这意味着,与数据传输对象(DTO)不同,实体具有实现业务逻辑的方法。实际上,我们应该尽可能在实体中实现业务规则。...聚合根/实体中的主键 一个聚合根通常有一个ID属性作为其标识符(主键,Primark Key: PK)。推荐使用 Guid 作为聚合根实体的PK。 聚合中的实体(不是聚合根)可以使用复合主键。...这并不意味着子集合实体应该总是有复合主键,只有当需要时设置;通常是单一的ID属性。 复合主键实际上是关系型数据库的一个概念,因为子集合实体有自己的表,需要一个主键。...初始化子集合,当使用 Labels 集合时,不会获取到空引用异常。 构造函数将参数id传递给base类,不在构造函数中生成 Guid,可以将其委托给另一个 Guid生成服务,作为参数传递进来。...AssignToAsync 获取一个 AppUser 实体,实际上只用到 user.Id,传递实体是为了确保参数值是一个存在的用户,而不是一个随机值。

    3.1K30

    .Net 从零开始构建一个框架之基本实体结构与基本仓储构建

    ).接下去,就是使用OOP技术来构建这个实体结构....首先这个实体既然需要写入数据库,那么它必定有一个主键Id.同时这个主键Id可以是任意数据类型,当然用的最多的就是GUID和INT作为主键.前面全局唯一,后者查询效率快..../// TPrimaryKey Id { get; set; } } 其次,以不同数据类型(GUID、int、string)为主键的实体类型...接着,基本实体就出现了,这里我分为两类,一类以int为主键,一类已Guid主键,为别写道两个类中,如下代码: /// /// 以int为主键的实体类型 ///...{ } 打上Serializable特性,方便序列化.这里不同的子类使用abstract来实现,也是为了提供各自实体的共有抽象属性(或者方法).到这一步,最最基本的实体抽象构建完毕,但是还没有结束

    76430

    DDD领域驱动设计总结和C#代码示例

    值对象通常是不可变的,这意味着一旦创建,它们的内部状态就不能被改变。 聚合(Aggregate) 聚合是一组不能独立存在的实体和值对象的集合,它们一起作为数据修改和持久化的基本单元。...应用服务处理应用程序的工作流程,协调领域对象来执行用例,并最终引发领域事件。应用服务通常作为API或用户界面与外部世界交互。...实体(Entity) public class Student : Entity { public Student(Guid id, string name, string email)...{ Id = id; Name = name; Email = email; } public Guid Id { get; private...同时我们创建了一个StudentFactory作为反腐败层,用于将外部系统的学生信息转换为内部Student实体。 EventBus作为领域事件总线,负责事件的发布和订阅。

    34110

    【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览

    项目在初期使用的反射+缓存,虽然 .NETCore 优化了反射性能,但经过与Dapper性能测试对比之后,发现仍然有一定差距,改成 ExpresstionTree 后才与 Dapper 性能相当。...() 作为查询字段 //奇思妙想:怎么查询开窗函数的结果 }); //返回更为复杂的结构 List t7 = select.From的理念可能不太一致,作为功能库FreeSql支持到了极致,至于是否使用是项目组技术衡量的另一个问题。...尽管多种数据库适配逻辑非常复杂,FreeSql始终秉承优化程序开发习惯的原则尽量去现实,中间碰到了一些非技术无法攻克的难题,比如数据库的自定义类型,和实体类本身就是一种冲突,为了减少使用成本,诸如此类的数据库功能没有得到支持...关系型数据库有许多成熟的运维和开发类配套工具,例如我们所关注的ER图工具 PowerdeSigner,使用它可以更直观的查看表之间的关系。

    56030

    领域驱动设计案例之领域层框架搭建

    2.Aggreate中主要定义了两个接口,一个是IEntity,一个是IAggreateRoot,分别表示实体与聚合根。...我这里直接用表未来的GUID主键作为实体的唯一标识符 using System; namespace Order.Domain.Aggreate { public interface IEntity...{ Guid Id { get; } } } namespace Order.Domain.Aggreate { public interface IAggreateRoot...2)将接口定义在领域层,减少技术架构依赖,应用层或领域层要使用某个仓储实现时,通过依赖注入的方式将仓储实现注射到应用层或领域层,具体IOC在使用时对应用层与领域层的建议见前面的文章。  ...通常我们的业务需要持久化整个聚合的多个实体或通过领域服务或应用服务持久化多个聚合,多个实体或聚合在业务上需要保持一致性,为了达到这个目的,我们引入了工作单元模式与定义了仓储上下文,通过仓储上下文来管理操作的多个实体或多个聚合中的实体

    98770

    在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回

    本篇文章通过实例的方式,讨论两个在EF使用存储过程的主题:如何通过实体和存储过程的映射实现逻辑删除;对于具有自增长类型主键的数据表,在进行添加操作的时候如何将正确的值反映在实体对象上。...三、具有自增长列的存储过程定义 接下来我们来讨论另一个常见的场景:如果一个表中存在一个自增长列作为该表的主键,当我们通过提交对应的实体对象进行记录添加操作时,数据库中真正的键值如何返回并赋值给该实体对象...为了让存储过程中SELECT语句返回的结果集体现在被提交的Contact对象上,你需要设置列名(或者通过AS操作符设置的别名)与实体类型的属性之间的映射关系。...(一):实现存储过程的自动映射 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?...在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?

    1.7K80

    数据治理之元数据管理的利器——Atlas入门宝典(万字长文)

    该模型由称为“类型”的定义组成。称为“实体”的“类型”实例表示受管理的实际元数据对象。Type System是一个允许用户定义和管理类型和实体的组件。...它也是查询和发现Atlas管理的类型和实体的主要机制。 Messaging: 除了API之外,用户还可以选择使用基于Kafka的消息传递接口与Atlas集成。...如果希望使用与Atlas更松散耦合的集成来实现更好的可伸缩性,可靠性等,则消息传递接口特别有用.Atlas使用Apache Kafka作为通知服务器,用于钩子和元数据通知事件的下游消费者之间的通信。...' Classification 分类传播使与实体相关联的分类能够自动与该实体的其他相关实体相关联。...更新与实体关联的分类 与实体关联的分类的任何更新也将在分类传播到的所有实体中看到。 简单的说,此功能可以监控数据到底流向了哪里。

    2.7K23

    数据治理之元数据管理的利器——Atlas入门宝典

    该模型由称为“类型”的定义组成。称为“实体”的“类型”实例表示受管理的实际元数据对象。Type System是一个允许用户定义和管理类型和实体的组件。...它也是查询和发现Atlas管理的类型和实体的主要机制。 Messaging: 除了API之外,用户还可以选择使用基于Kafka的消息传递接口与Atlas集成。...如果希望使用与Atlas更松散耦合的集成来实现更好的可伸缩性,可靠性等,则消息传递接口特别有用.Atlas使用Apache Kafka作为通知服务器,用于钩子和元数据通知事件的下游消费者之间的通信。...' Classification 分类传播使与实体相关联的分类能够自动与该实体的其他相关实体相关联。...更新与实体关联的分类 与实体关联的分类的任何更新也将在分类传播到的所有实体中看到。 简单的说,此功能可以监控数据到底流向了哪里。

    1.7K20

    数据治理之元数据管理的利器——Atlas入门宝典

    该模型由称为“类型”的定义组成。称为“实体”的“类型”实例表示受管理的实际元数据对象。 Type System是一个允许用户定义和管理类型和实体的组件。...它也是查询和发现Atlas管理的类型和实体的主要机制。 Messaging: 除了API之外,用户还可以选择使用基于Kafka的消息传递接口与Atlas集成。...如果希望使用与Atlas更松散耦合的集成来实现更好的可伸缩性,可靠性等,则消息传递接口特别有用.Atlas使用Apache Kafka作为通知服务器,用于钩子和元数据通知事件的下游消费者之间的通信。...' Classification 分类传播使与实体相关联的分类能够自动与该实体的其他相关实体相关联。...更新与实体关联的分类 与实体关联的分类的任何更新也将在分类传播到的所有实体中看到。 简单的说,此功能可以监控数据到底流向了哪里。

    4.2K32

    DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

    1.实体、聚合根与值对象的顶层体现 实体顶层定义: public interface IEntity { string Code { get; set; } Guid...值对象顶层定义: public interface IValueObject { Guid Id { get; set; } } 值对象接口只需要保留一个技术主键即可,...在数据库中,值对象可能作为单独表存储,也可以作为实体的一部分存储。你也可以扩展这个接口,定义两个值对象比较接口(未来实现 就是比较两个值对象如果所有属性值一致,则代表两个值对象相等)。...2.常用工具类的实现 我们还应该定义另一个项目,这个项目是整个系统都需要使用到的工具,其中至少应该包括Asp.net Core Json配置文件的读,Json序列化与反序列化,加密,依赖注入,返回给前端的对象格式定义等...好了,基本的框架搭建好了,下一章就可以直接进入案例,看案例中如何通过DDD思想进行设计,并通过经典DDD架构与DDD轻量级框架进行实际业务系统的代码编写。

    1.3K50

    【BCVP升级】泛型主键的使用

    今天继续推进BCVP项目的往下进行,新开了一个需求,这个需求来自于网友的提问:目前BlogCore项目默认使用的是int作为主键,并自增,平时开发的时候int或者long这个都是很常见的,但是如果说,我就不想用...(new Advertisement()); 3、注意仓储执行方法 因为之前我们都是使用的int作为主键,然后用的.ExecuteReturnIdentityAsync()方法,这样返回的是对应的id。...但是现在用了Guid以后,就不能这么用了,因为这样使用的话,这个方法是无效的.ExecuteReturnIdentityAsync(),不仅不会正常的返回id值,也无非自动生成Guid的默认值,你可以使用....ExecuteCommandAsync(),当然可以直接使用.ExecuteReturnEntityAsync()这个方法,来返回实体,然后从实体里,获取对应的Id,这样的话,不论是int还是Guid...4、查看效果 设置了Guid以后,就可以看看效果了,上边的0000-000-0000-000这样的值,就是因为使用的.ExecuteReturnIdentityAsync(),下边的是正常的使用Command

    69110

    初探领域驱动设计(1)为复杂业务而生

    在这里并非针对某个人,实际上我认为他们说的是对的,在资源有限的情况下,我们为了完成项目的交付,这是我们最好的选择。...作为一个高级程序员,我们得用面向对象的方式去开发,先建类。...它将作为开发人员与业务人员、测试人员以及开发人员自己之间沟通的桥梁。...聚合与聚合根:它的主要作用是用来确保各种关系下的实体的数据一致性;但是确认聚合根这个过程,实际上也是对业务的梳理过程。 架构分层: 每一层都职责清楚;依懒于接口来降低耦合。...是否一定要使用DTO呢?领域实体和DTO互相转换,最后到了表现层DTO还要和ViewModel转换,会不会带来复杂性和性能上的损失?Repository和EF还有Unit Of Work怎么来协调?

    1K60
    领券