【问题标题】:Get List of Modified Objects within Entity Framework 7获取实体框架 7 中已修改对象的列表
【发布时间】:2017-01-29 11:30:25
【问题描述】:

我很难过 - 升级到 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 中获取修改对象的列表?

【问题讨论】:

  • 使用context.ChangeTracker.Entries().Where(x=&gt; x.State == ... )
  • @dotctor 添加为答案,以便我接受该答案

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


【解决方案1】:

您可以使用DbContext.ChangeTracker

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

【讨论】:

  • 如何从 ChangeTracker 获取修改后的属性
  • @kevinc context.Entry(someObject).Properties.Where(m => m.IsModified);
  • @ScottE 我没有看到任何可用于 DbEntityEntry 类的 Properties 属性link
【解决方案2】:

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

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

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


微软对 ChangeTracker.HasChanges() 的总结

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多