在 Entity Framework 5 中刷新数据的最佳方式是什么?我有一个 WPF 应用程序,显示来自数据库的统计数据,其中数据一直在变化。应用程序每 10 秒更新一次结果,但 EF 的默认行为似乎是缓存以前的结果。因此,我想要一种使先前结果无效的方法,以便可以加载一组新数据。
感兴趣的上下文按以下方式定义:
public partial class MyEntities: DbContext
{
...
public DbSet<Stat> Stats { get; set; }
...
}
经过一番阅读,我找到了一些方法,但我不知道这些方法的效率如何,以及它们是否有缺点。
创建实体对象的新实例
using (var db = new MyEntities()) { var stats = from s in db.Stats ... }
这可行,但感觉效率低下,因为还有许多其他地方可以检索数据,而且我不想每次需要一些数据时都重新打开新连接。保持连接打开并以另一种方式进行不是更有效吗?
致电
refresh
_ObjectContext
var stats = from s in db.Stats ... ObjectContext.Refresh(RefreshMode.StoreWins, stats );
这也假设我以这种方式从 dbContext 中提取 ObjectContext:
private MyEntities db = null; private ObjectContext ObjectContext { get { return ((IObjectContextAdapter)db).ObjectContext; } }
这是我现在使用的解决方案。看起来很简单。但是我在某处读到 ObjectContext 现在不能在 DbContext 中直接访问,因为 EF 团队认为没有人会需要它,并且您可以直接在 DbContext 中做所有您需要的事情。这让我觉得也许这不是最好的方法,或者?
我知道有一种
reload
方法,dbContext.Entry
但是由于我不是重新加载单个实体而是检索实体列表,所以我真的不知道这种方法是否可行。如果我在第一个查询中获得 5 个 stat 对象,将它们保存在一个列表中,并reload
在需要更新时对它们进行操作,我可能会错过已添加到数据库列表中的其他对象。还是我完全误解了这个reload
方法?我可以重新加载DbSet
指定的 inMyEntities
吗?
上面有很多问题,但我主要想知道的是EF5 中一遍又一遍地向数据库询问相同查询的最佳实践是什么?这很可能是我还没有发现的东西......