在Entity Framework中,是否可以找到我的实体上下文中是否有未保存的更改?
Answers:
这可能有效(如果通过更改意味着添加,删除和修改了实体):
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
。
EntityState.Modified
)。eq如果您自己替换一个值,EF将返回1 modified object
。您必须事先检查值是否不同。
对于使用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
因为EntityState.Added
是System.Data.Entity
从而不是从System.Data
。
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }