检查是否有任何未决更改要保存
这可能会实现(如果改变你的意思是添加,删除和修改实体):
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'。 – 2010-06-29 12:38:30
补充一下 - 今天就阅读你的博文吧!谢谢;) – Yakimych 2010-06-29 13:05:35
请注意,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不会产生正确的结果。
从EF 6开始,有context.ChangeTracker.HasChanges()
。
最新的答案。 – Zapnologica 2015-12-23 03:42:21
截至2016年,这是答案,恕我直言。 – ozgur 2016-05-02 10:36:27
现在这是其他人提到的最佳答案。 – Yokomoko 2017-03-07 14:04:31
context.savechanges()不会自动检查吗?我想问的原因是我认为一些人会尝试做以下事情:'if(db.ChangeTracker.HasChanges()){await db.SaveChangesAsync(); }' – Zapnologica 2015-12-23 03:43:39