检查是否有任何未决更改要保存

问题描述:

有没有一种方法可以确定在实体框架中是否存在未保存的更改?检查是否有任何未决更改要保存

+0

context.savechanges()不会自动检查吗?我想问的原因是我认为一些人会尝试做以下事情:'if(db.ChangeTracker.HasChanges()){await db.SaveChangesAsync(); }' – Zapnologica 2015-12-23 03:43:39

这可能会实现(如果改变你的意思是添加,删除和修改实体):

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(); 
+11

+1通常在正确的轨道上,但使用'Any()',而不是'Count()> 0'。 – 2010-06-29 12:38:30

+0

补充一下 - 今天就阅读你的博文吧!谢谢;) – Yakimych 2010-06-29 13:05:35

+0

请注意,EF不检查值是否真的不同(对于'EntityState.Modified')。 e.q.如果你自己替换一个值,EF将返回'1修改对象'。如果值不同,你必须事先检查。 – 2016-01-05 14:37:15

对于那些你使用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不会产生正确的结果。

+4

谢谢,接受的答案对我来说并不适用,而你的做法(EF v.4.3)。 – Christian 2013-01-18 14:54:18

+1

'EntityState.Added'的EntityState来自'System.Data.Entity',而不是'System.Data'。 – Yuck 2014-02-17 13:38:08

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

+1

最新的答案。 – Zapnologica 2015-12-23 03:42:21

+1

截至2016年,这是答案,恕我直言。 – ozgur 2016-05-02 10:36:27

+0

现在这是其他人提到的最佳答案。 – Yokomoko 2017-03-07 14:04:31