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

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

31021 次浏览

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

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

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

从 EF6开始,就是 context.ChangeTracker.HasChanges()