1

在 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 中一遍又一遍地向数据库询问相同查询的最佳实践是什么?这很可能是我还没有发现的东西......

4

1 回答 1

1

实际上,即使看起来违反直觉,第一个选项也是正确的,请参阅

DbContext设计寿命很短,因此与重新加载所有内容的成本相比,它们的实例化成本非常低,这主要是由于缓存之类的事情,以及它们的数据加载设计。

这也是 EF 与 ASP .NET MVC 如此“自然”地配合使用的原因,因为DbContext在每次请求时都会实例化 EF。

当然,这并不意味着您必须DbContext在整个地方创建,在您的上下文中,使用DbContext每次更新操作(每 10 秒发生一次)似乎已经足够好了,如果在该操作期间您需要删除特定行,因为例如,你会传递DbContext,而不是创建一个新的。

于 2013-09-12T10:02:56.303 回答