在调用SaveChanges之前从EF集合获取对象

本文关键字:EF 集合 获取 取对象 调用 SaveChanges | 更新日期: 2023-09-27 17:59:48

使用实体框架,我有一个名为WorkSet的表。我添加了一个项目如下:

_entity.WorkSet.AddObject( new WorkSet() { Name = "Something" } );

当我在此之后查询表时,我没有收到任何结果。

_entity.WorkSet.Count() == 0 // always true

也就是说,直到我调用SaveChanges。我理解为什么它是这样工作的,但我想知道在通过SaveChanges将更改持久化到数据库之前,如何查看实体中的更改。我希望这是一个可以迅速解决的简单问题。谢谢

在调用SaveChanges之前从EF集合获取对象

_entity.WorkSet实现IQueryable,因此调用Count()将导致sql查询。在调用SaveChanges之前,数据库中没有记录,所以它将返回0。如果您想在保存更改之前引用添加的对象,请使用以下代码:

_entity.WorkSet.Context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged).Where(e => e.Entity is WorkSet).Select(e => e.Entity as WorkSet).Count();

我想,如果你使用的是EF 1,如果你换一个新版本,有一个更简单的解决方案:

_entity.WorkSet.Local.Count();

为此使用ObjectContext.SavingChanges事件。在通过查看ObjectStateManager添加或修改的事件处理程序检查实体中,这些实体将被保存。

context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)

如果您处理的是DbContext,请使用以下代码从中获取ObjectContext

var adapter = (IObjectContextAdapter)dbContext;
var objectContext = adapter.ObjectContext;

使用以下代码获取新添加的工作集:

var entries = context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Added)
                     .Where(entry => entry.Entity.GetType() == typeof(WorkSet));