获取实体框架7中的已修改对象列表

时间:2015-09-15 19:39:00

标签: c# .net entity-framework dbcontext entity-framework-core

我很难过 - 升级到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();

然而,现在在{1}}中删除了ObjectContext,我被困住了,我将如何在Entity Framework 7中获取修改对象的列表?

2 个答案:

答案 0 :(得分:9)

您可以使用DbContext.ChangeTracker

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

答案 1 :(得分:0)

@dotctor的代码在某些情况下可能无效。

在某些情况下,更改跟踪器可能没有关于上下文管理的实体的最新信息,因此可以修改/添加/删除实体,而无需更改跟踪器知道的。为了避免这种情况,我将@dotctor的代码包装在以下条件中:

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


Microsoft ChangeTracker.HasChanges摘要()

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