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

时间:2014-04-24 15:34:21

标签: c# .net entity-framework

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

为此目的使用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));

答案 1 :(得分:2)

_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();