【问题标题】:Best practice to refresh an EF5 result from database从数据库刷新 EF5 结果的最佳实践
【发布时间】:2013-09-16 13:21:19
【问题描述】:

在 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 ...
    }
    

    这可行,但感觉效率低下,因为还有许多其他地方可以检索数据,而且我不想每次需要一些数据时都重新打开新连接。保持连接打开并以其他方式进行不是更有效吗?

  • 拨打refreshObjectContext

    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 中做所有您需要的事情。这让我觉得也许这不是最好的方法,或者?

  • 我知道dbContext.Entry 有一个reload 方法,但是由于我不是重新加载单个实体而是检索实体列表,所以我真的不知道这种方法是否可行。如果我在第一个查询中获得 5 个 stat 对象,将它们保存在一个列表中,并在需要更新时对它们执行 reload,我可能会错过已添加到数据库列表中的其他对象。还是我完全误解了reload 方法?我可以在MyEntities 中指定的DbSet 上重新加载吗?

上面有很多问题,但我主要想知道的是在 EF5 中反复向数据库询问相同查询的最佳做法是什么?很可能是我还没有发现的东西......

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在阅读了您的链接和其他一些链接之后,我开始更多地理解为什么最好不要将 DbContext 的实例保留太久。我不知道它正在缓存所有更改,而这些更改在一个整天运行的应用程序中可能很多。感谢您的回答...
    • @Ohlin 我很高兴,我喜欢与 DBContext 一起使用的一个技巧,就是认为它的用法是对 ASP.NET MVC 操作的请求,即使在 WPF 中,也有助于获得单个 DbContext 对象的使用范围的好主意。
    猜你喜欢
    • 2023-04-08
    • 2016-03-04
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2012-09-16
    • 2016-08-26
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多