有没有一种方法可以在Entity Framework中找出我实体上下文中是否存在未保存的更改?
有没有一种方法可以在Entity Framework中找出我实体上下文中是否存在未保存的更改?
从 EF 6 开始,有 context.ChangeTracker.HasChanges()
方法。
这可能有效(如果更改意味着添加、删除和修改实体):
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();
Any()
而不是Count() > 0
。 - Craig Stuntz如果你正在使用 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不会产生正确的结果。
EntityState.Added
是来自于 System.Data.Entity
而不是 System.Data
。 - Yuck
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }
- Zapnologica