获取 Entity Framework 内的已修改对象列表 7

Get List of Modified Objects within Entity Framework 7

我很难过 - 升级到 Entity Framework 7 并且我通常会覆盖 DbContext 中的 SaveChanges 以便能够在更改之前获取所有已修改对象的列表。最终,我有一个脚本可以触发,用于跟踪数据库中的先前版本。在 Entity Framework 6 中,我会得到这样的模型更改:

var oc = ((IObjectContextAdapter)this).ObjectContext;
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted);

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList();

但是现在 ObjectContext 在 Entity Framework 7 中被删除了,我卡住了,我如何在 Entity Framework 7 中获取修改对象的列表?

您可以使用DbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker
       .Entries()
       .Where(x => x.State == EntityState.Modified)
       .Select(x =>x.Entity)
       .ToList();

@dotctor 的代码在某些情况下可能不起作用。

在某些情况下,更改跟踪器可能没有关于上下文管理的实体的最新信息,因此实体可能是modified/added/deleted没有变化跟踪器知道。为避免这种情况,我会将 @dotctor 的代码包装在以下条件中:

if(context.ChangeTracker.HasChanges())
{
  ...
}


ChangeTracker.HasChanges() 的 Microsoft 摘要:

检查是否正在跟踪任何新的、删除的或更改的实体,以便在调用 DbContext.SaveChanges 或 DbContext.SaveChangesAsync 时将这些更改发送到数据库。请注意,此方法调用 ChangeTracker.DetectChanges 除非 ChangeTracker.AutoDetectChangesEnabled 已设置为 false。