You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Entity Framework Core批量插入实体的真实ID?

如何获取EF批量插入后实体的真实数据库ID并建立关联

问题出在调用SaveChanges()的时机:你现在是在循环里添加实体后立即获取ID,但此时实体还没真正写入数据库,EF只会分配临时的负数ID;只有当SaveChanges()执行完成,数据库生成真实自增ID后,EF才会把这个ID回填到实体对象中。

最优解决方案:先批量添加,保存后再建立关联

不需要在循环里单独保存,而是先把所有待插入的实体和原列表项对应存储,执行SaveChanges()后再配对ID:

var idLinks = new List<Link>();
// 用一个列表保存新增的实体,和原列表的项一一对应
var insertedEntities = new List<MyEntity>();

foreach (var item in List)
{
    var entity = new MyEntity();
    entity.col1 = item.x;
    entity.col2 = item.y;                  

    insertedEntities.Add(entity);
    _db.MyEntity.Add(entity);
}

// 一次性保存所有实体,此时数据库生成真实ID,EF自动回填到每个entity的ID属性
_db.SaveChanges();

// 现在建立原列表项与新实体ID的关联
for (int i = 0; i < List.Count; i++)
{
    idLinks.Add(new Link 
    { 
        Id1 = List[i].id, 
        Id2 = insertedEntities[i].ID // 这里已经是真实数据库ID了
    });
}

关键说明

  1. EF的ID回填机制:只要你的MyEntity.ID字段配置为数据库生成(比如用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性,或者Fluent API的.HasKey(e => e.ID).Property(e => e.ID).ValueGeneratedOnAdd()),执行SaveChanges()后,EF会自动把数据库生成的ID更新到实体对象的ID属性中。
  2. 避免循环内多次SaveChanges():如果在循环里每次Add后都调用SaveChanges(),虽然也能拿到真实ID,但会产生多次数据库连接,性能极差,不推荐用于批量插入场景。

内容的提问来源于stack exchange,提问作者Bex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:02:10