如何从db刷新ObjectContext缓存?

时间:2010-02-25 02:38:29

标签: c# .net entity-framework objectcontext

我们正在从db:

加载数据
var somethings = Context.SomethingSet.ToList();

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

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

3 个答案:

答案 0 :(得分:19)

您正在寻找Refresh方法:

Context.Refresh(RefreshMode.StoreWins, somethings);

答案 1 :(得分:12)

EF数据上下文是工作单元模式的实现。因此,它不是为了超越正在完成的工作单元而设计的。完成工作后,期望您的数据上下文被丢弃。

这是EF v1,EF v4和LINQ to SQL的基本设计决策。除非您拥有非常具体的数据使用模式和大量内存,否则应避免将数据上下文保留的时间超过完成工作单元所需的时间。

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

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

答案 2 :(得分:1)

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

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);
}