代码之家  ›  专栏  ›  技术社区  ›  LukLed

如何从数据库刷新ObjectContext缓存?

  •  15
  • LukLed  · 技术社区  · 16 年前

    我们正在从数据库加载数据:

    var somethings = Context.SomethingSet.ToList();
    

    然后有人删除或添加上下文之外的行。out-context仍然有缓存已删除的对象,因为它不知道这些对象已被删除。即使我调用context.somethingset.tolist(),我们的上下文仍然包含已删除的对象,导航属性也不正确。

    从数据库刷新整个集合的最佳方法是什么?

    3 回复  |  直到 11 年前
        1
  •  19
  •   Josh    16 年前

    这个 Refresh 方法就是您要寻找的:

    Context.Refresh(RefreshMode.StoreWins, somethings);
    
        2
  •  12
  •   jrista    16 年前

    EF数据上下文是工作单元模式的实现。因此,它的设计并不是为了保持在正在完成的工作单元之外。一旦您的工作完成,期望您的数据上下文被丢弃。

    这是EFv1、EFv4和LINQtoSQL的基本设计决策。除非您有非常具体的数据使用模式和大量的内存,否则您应该避免将数据上下文保存在比完成工作单元所绝对需要的时间长的地方。

    http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

    http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

        3
  •  1
  •   rnofenko    11 年前

    对于虚拟属性,重新加载没有帮助。它需要分离并重新加载

    public T Reload<T>(T entity) where T : class, IEntityId
    {
        ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
        return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
    }