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

EF6中调用SaveChangesAsync后如何优雅获取新增记录标识字段?

EF6中获取新增实体主键的优雅实现

不用额外维护List来存新增实体,EF6本身提供了两种更简洁的方式:

方式一:通过DbContext的ChangeTracker查询

调用SaveChangesAsync后,上下文的ChangeTracker会跟踪所有实体的状态。你可以直接筛选出本次新增的Entity类型实体:

await db.SaveChangesAsync();
var addedEntities = db.ChangeTracker.Entries<Entity>()
    // SaveChanges后,新增实体的状态会从Added转为Unchanged,且主键已赋值
    .Where(entry => entry.State == EntityState.Unchanged && entry.Entity.Id != default(int))
    .Select(entry => entry.Entity)
    .ToList();

注意:如果上下文同时还有其他地方新增的同类型实体,这个方法会一并获取,适合本次操作是唯一新增该类型实体的场景。

方式二:从父实体集合中筛选新增子实体

因为你是把新增实体添加到parentEntity.NewEntity集合中,SaveChanges后这些实体的主键会自动填充,你可以直接从集合中筛选出主键不为默认值的实体(假设主键是int类型,默认值为0):

await db.SaveChangesAsync();
var newChildEntities = parentEntity.NewEntity
    .Where(e => e.Id != 0)
    .ToList();

如果要更严谨(比如主键类型不是int),可以通过上下文判断实体的原始值:

await db.SaveChangesAsync();
var newChildEntities = parentEntity.NewEntity
    .Where(e => 
        db.Entry(e).State == EntityState.Unchanged && 
        db.Entry(e).OriginalValues.GetValue<YourKeyType>("Id") == default(YourKeyType)
    )
    .ToList();

本质上,EF6在执行SaveChangesAsync后,会自动将生成的主键赋值给新增实体的对应属性,所以不管是用ChangeTracker还是父集合筛选,都能直接拿到带主键的实体,不用额外维护List来存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:20:28