检查是不是有任何待保存的更改要保存
Posted
技术标签:
【中文标题】检查是不是有任何待保存的更改要保存【英文标题】:Check if there are any pending changes to be saved检查是否有任何待保存的更改要保存 【发布时间】:2011-03-09 01:31:18 【问题描述】:有没有办法在实体框架中找出我的实体上下文中是否有未保存的更改?
【问题讨论】:
context.savechanges() 不会自动检查这个吗?我问的原因是我认为有些人会尝试执行以下操作:if (db.ChangeTracker.HasChanges()) await db.SaveChangesAsync();
【参考方案1】:
从 EF 6 开始,有context.ChangeTracker.HasChanges()
。
【讨论】:
最新答案。 截至 2016 年,这就是答案,恕我直言。 这是现在其他人提到的最佳答案。 完美解决方案!感谢分享。你知道如何及时捕捉变化并用“*”标记修改后的表格吗?喜欢:Form1*【参考方案2】:这可能有效(如果您所说的更改是指添加、删除和修改的实体):
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
。
该死 - 今天就阅读你的博文吧!谢谢;)
请注意,EF 不检查值是否真的不同(对于EntityState.Modified
)。等式如果你自己替换一个值,EF 将返回1 modified object
。您必须事先检查该值是否不同。【参考方案3】:
对于那些使用 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 v.4.3)。EntityState
for EntityState.Added
来自System.Data.Entity
而不是来自System.Data
。以上是关于检查是不是有任何待保存的更改要保存的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何方法可以使用 ABCpdf 抑制“是否要在关闭前保存对 xxx.pdf 的更改”对话框