如何获取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了 }); }
关键说明
- EF的ID回填机制:只要你的
MyEntity.ID字段配置为数据库生成(比如用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性,或者Fluent API的.HasKey(e => e.ID).Property(e => e.ID).ValueGeneratedOnAdd()),执行SaveChanges()后,EF会自动把数据库生成的ID更新到实体对象的ID属性中。 - 避免循环内多次SaveChanges():如果在循环里每次Add后都调用
SaveChanges(),虽然也能拿到真实ID,但会产生多次数据库连接,性能极差,不推荐用于批量插入场景。
内容的提问来源于stack exchange,提问作者Bex
相关产品推荐
相关产品推荐

