在调用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
将更改持久化到数据库之前,如何查看实体中的更改。我希望这是一个可以迅速解决的简单问题。谢谢
_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));