在SaveChanges之前的AddObject之后查询对象?

Sta*_*Cub 16 entity-framework entity-framework-4

在EntityFramework中,是否可以在调用SaveChanges方法之前使用AddObject查询刚刚添加到上下文中的对象?

谢谢

Ari*_*ini 28

要保持实体,您通常会DbSet在上下文中将其添加到实体中.

例如

var bar = new Bar();
bar.Name = "foo";
var context = new Context();
context.Bars.Add(bar);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,查询context.Bars,无法找到刚刚添加的实体

var howMany = context.Bars.Count(b => b.Name == "foo");
// howMany == 0
Run Code Online (Sandbox Code Playgroud)

context.SaveChanges()同一行之后会产生1

DbSet直到他们的分贝坚持似乎察觉到的变化.

幸运的是,每个属性都有DbSet自己的Local属性DbSet,但它反映了所有内存中的操作

var howMany = context.Bars.Local.Count(b => b.Name == "foo");
// howMany == 1
Run Code Online (Sandbox Code Playgroud)

您还可以使用Local添加实体

context.Bars.Local.Add(bar);
Run Code Online (Sandbox Code Playgroud)

并摆脱实体框架的奇怪行为.

  • 这是否返回已添加但未保存的数据库以及数据库中的项目? (3认同)

Jay*_*ena 10

你可以查询这样的对象,

context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Select(obj => obj.Entity).OfType<TheEntityType>()
Run Code Online (Sandbox Code Playgroud)

这将查询处于添加状态的对象.如果你也想要其他状态,你可以将所有其他状态传递给这样的GetObjectStateEntries方法.

GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged)
Run Code Online (Sandbox Code Playgroud)