检查是否有任何待保存的更改要保存


Answers:


61

这可能有效(如果通过更改意味着添加,删除和修改了实体):

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

12
+1表示通常在正确的轨道上,但使用Any()而不是Count() > 0
Craig Stuntz 2010年

真是的-今天就读您的博客文章吧!谢谢;)
Yakimych 2010年

请注意,EF不会检查value是否真的不同(对于EntityState.Modified)。eq如果您自己替换一个值,EF将返回1 modified object。您必须事先检查值是否不同。
Matthieu Charbonnier

102

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


3
最新答案。
Zapnologica 2015年

1
截至2016年,这就是答案,恕我直言。
ozgur

正如其他人所说,这是最好的答案。
Yokomoko

干净的解决方案!感谢分享。您是否知道如何及时捕获更改并用“ *”标记已修改的表单?像:Form1 *
Rapunzo

43

对于使用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)。
基督教徒

1
EntityState因为EntityState.AddedSystem.Data.Entity从而不是从System.Data
Yuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.