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

Pal*_*tir 70 entity-framework entity-framework-4 entity-framework-5 entity-framework-6

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

Tha*_*den 85

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

  • 最新的答案. (2认同)

Yak*_*ych 57

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

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
                    ) > 0;
Run Code Online (Sandbox Code Playgroud)

编辑:

改进代码:

bool changesMade = context.
                   ObjectStateManager.
                   GetObjectStateEntries(EntityState.Added | 
                                         EntityState.Deleted | 
                                         EntityState.Modified
                                        ).Any();
Run Code Online (Sandbox Code Playgroud)

  • +1通常在正确的轨道上,但使用`Any()`,而不是`Count()> 0`. (12认同)

Yuc*_*uck 42

对于那些使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,接受的答案对你来说并不适用于你(EF v.4.3). (4认同)