【问题标题】:Check if there are any pending changes to be saved检查是否有任何待保存的更改要保存
【发布时间】:2011-03-09 01:31:18
【问题描述】:

有没有办法在实体框架中找出我的实体上下文中是否有未保存的更改?

【问题讨论】:

  • context.savechanges() 不会自动检查这个吗?我问的原因是我认为有些人会尝试执行以下操作:if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }

标签: entity-framework entity-framework-4 entity-framework-5 entity-framework-6


【解决方案1】:

从 EF 6 开始,有context.ChangeTracker.HasChanges()

【讨论】:

  • 最新答案。
  • 截至 2016 年,这就是答案,恕我直言。
  • 这是现在其他人提到的最佳答案。
  • 完美解决方案!感谢分享。你知道如何及时捕捉变化并用“*”标记修改后的表格吗?喜欢:Form1*
【解决方案2】:

这可能有效(如果您所说的更改是指添加、删除和修改的实体):

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
                    ) > 0;

编辑:

改进的代码:

bool changesMade = context.
                   ObjectStateManager.
                   GetObjectStateEntries(EntityState.Added | 
                                         EntityState.Deleted | 
                                         EntityState.Modified
                                        ).Any();

【讨论】:

  • +1 表示通常在正确的轨道上,但使用Any(),而不是Count() > 0
  • 该死 - 今天就阅读你的博文吧!谢谢;)
  • 请注意,EF 不检查值是否真的不同(对于EntityState.Modified)。等式如果你自己替换一个值,EF 将返回1 modified object。您必须事先检查该值是否不同。
【解决方案3】:

对于那些使用 EF 4+ 的人,这里有一个等效的解决方案作为扩展方法:

public static class DbContextExtensions {
    public static Boolean HasPendingChanges(this DbContext context) {
        return context.ChangeTracker.Entries()
                      .Any(e => e.State == EntityState.Added
                             || e.State == EntityState.Deleted
                             || e.State == EntityState.Modified);
    }
}

请注意,您不能将这些值组合为位掩码。 GetObjectStateEntries() 函数为您处理了逻辑,但 LINQ 不会产生正确的结果。

【讨论】:

  • 谢谢,我接受的答案对我不起作用(EF v.4.3)。
  • EntityState for EntityState.Added 来自System.Data.Entity 而不是来自System.Data
猜你喜欢
  • 2013-11-06
  • 2013-08-11
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多