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
相关产品推荐
相关产品推荐

