如何避免DbContext.Add()后EF Core回读主键
如何避免EF Core插入实体后回读主键
EF Core默认回读自增主键是为了同步内存中跟踪实体的状态,方便后续更新,但在不需要复用实体的场景下,确实可以通过以下正规方式跳过这个回读步骤:
使用无跟踪添加实体(EF Core 5+)
直接调用AddAsNoTracking方法添加实体,EF Core不会跟踪该实体的状态,也就不需要回读主键来同步。示例代码:var person = new Person { Name = "john" }; context.Persons.AddAsNoTracking(person); await context.SaveChangesAsync();执行后只会生成INSERT语句,不会触发后续的SELECT回读。
配置主键为非数据库生成值
如果业务场景允许自己生成主键值(比如提前生成唯一int或Guid),可以将主键配置为ValueGeneratedNever,告诉EF Core不需要从数据库获取主键值。配置示例:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .Property(p => p.Id) .ValueGeneratedNever(); }插入时自己指定Id值,EF Core不会触发回读操作。
批量插入场景使用专门的批量操作方案
如果是大量实体插入的场景,使用针对EF Core的批量操作类库(无需跟踪单个实体状态),这类工具通常默认不会执行主键回读,性能也比单条插入更优。
你之前用int?作为主键类型的方案之所以生效,是因为EF Core会对可空主键默认采用客户端生成的逻辑,但这种方案确实不够优雅,上面的几种方法更符合EF Core的设计规范。
内容的提问来源于stack exchange,提问作者IT demon
相关产品推荐
相关产品推荐

