从数据库刷新EF5结果的最佳实践

时间:2013-09-12 08:41:33

标签: c# entity-framework entity-framework-5 reload

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

1 个答案:

答案 0 :(得分:1)

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

DbContext的设计寿命较短,因此与重新加载所有内容的成本相比,它们的实例化成本相当低,这主要是由于缓存和数据加载设计等原因造成的。

这也是EF为什么“自然”与ASP .NET MVC一起工作的原因,因为DbContext在每次请求时都会被实例化。

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