EF Core操作Informix插入数据后生成多余SELECT语句的禁用方法咨询
EF Core操作Informix插入数据后生成多余SELECT语句的禁用方法咨询
我来帮你分析下这个问题,再给出具体的解决办法:
你遇到的这条额外的SELECT语句,其实是EF Core的默认行为——因为你的id列是Informix的serial类型(由数据库自动生成主键值),EF Core在完成插入操作后,会自动执行这条查询来获取数据库刚生成的主键值,然后把这个值回写到你插入的myTable对象的Id属性里,方便你后续代码直接从实体对象中拿到这个新生成的ID。
如果你的业务场景里,插入数据后不需要立即使用这个生成的ID值,那可以通过以下两种方法来禁用这个额外的查询:
方法一:通过实体配置关闭保存后的属性回写
在你的DbContext的OnModelCreating方法中,针对MyTable的Id属性添加如下配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyTable>(builder => { // 标记Id为数据库自动生成的标识列 builder.Property(t => t.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // 告诉EF Core,在保存完成后不需要再获取这个属性的值 .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore; }); }
这个配置是从实体模型层面直接控制EF的行为,它会明确告知EF:不需要在插入后去查询并更新实体的Id属性,自然也就不会生成那条多余的SELECT语句了。
方法二:使用无跟踪的插入方式(适合插入后无需操作该实体的场景)
如果你插入数据后,完全不需要在当前上下文实例中再使用这个myTable对象,也可以尝试用无跟踪的方式插入:
context.MyTable.Add(myTable); // 手动设置实体状态为Added,并关闭上下文对它的跟踪 context.Entry(myTable).State = EntityState.Added; context.SaveChanges();
不过相比之下,方法一的配置更直接可靠,属于从根源上控制行为,更推荐使用。
额外提醒
如果你在插入数据后必须要立即使用myTable.Id的值,那这条额外的SELECT语句其实是必要的——因为EF Core没办法直接知道数据库生成的serial值,只能通过查询获取。只有当你不需要这个值的时候,才适合禁用这个行为哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

