在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;
}
}
这是我现在使用的解决方案。看起来很简单。但我在某处读到,现在无法在DbContext中直接访问ObjectContext,因为EF团队并不认为任何人都需要它,并且您可以在DbContext中直接执行所需的所有操作。这让我觉得这可能不是最好的方法,或者?
我知道reload
有一种dbContext.Entry
方法,但由于我没有重新加载单个实体而是检索实体列表,所以我真的不是知道这种方式是否有效。如果我在第一个查询中获得了5个统计对象,请将它们保存在列表中,并在更新时对它们执行reload
,我可能会错过其他已添加到列表中的对象数据库。或者我完全误解了reload
方法?我可以在DbSet
中指定的MyEntities
重新加载吗?
上面有很多问题,但我主要想知道的是 EF5中一遍又一遍地向数据库询问相同查询的最佳做法是什么?很可能是我还没有发现的东西......
答案 0 :(得分:1)
实际上,即使看起来反直觉,第一个选项也是正确选项,请参阅this
DbContext
的设计寿命较短,因此与重新加载所有内容的成本相比,它们的实例化成本相当低,这主要是由于缓存和数据加载设计等原因造成的。
这也是EF为什么“自然”与ASP .NET MVC一起工作的原因,因为DbContext
在每次请求时都会被实例化。
这并不意味着您必须在所有地方创建DbContext
,在您的上下文中,使用DbContext
每次更新操作(每10秒发生一次)似乎足够好,如果在该操作期间,您需要删除特定行,例如,您将传递DbContext
,而不是创建新行。