无法清除EF中的缓存

时间:2013-12-04 11:10:59

标签: asp.net-mvc entity-framework

我在MVC中使用工厂模型时遇到问题。 当我更新并尝试显示来自同一个表的数据时,正在数据库中执行更新,但未从数据库中获取更新的数据。 我觉得它是从实体获取数据并显示数据。 我使用了Modelstate.clear()outputcache等,但没有一个工作。

使用的代码: 更新:

public virtual void Update(TObject TObject)
        {
            var entry = Context.Entry(TObject);
            DbSet.Attach(TObject);
            entry.State = EntityState.Modified;
        }

在我的服务中调用Update方法并保存更改:

Registry.RepositoryFactory.GetUsersRepository().Update(userobj);
            Registry.Context.SaveChanges();

保存后获取数据: 选择:

 public virtual IQueryable<TObject> All()
        {
            return DbSet.AsQueryable();
        }

我能够在数据库中更新,但是当它尝试从同一个表中立即检索数据时,它没有访问数据库,我认为它是从缓存中获取数据。

欢迎提出任何指示。

提前致谢,  吉里什。

2 个答案:

答案 0 :(得分:0)

我猜你正在为Update和Select重新使用相同的EF Context对象。如果在这些事件之间没有处理Context,那么最终会得到陈旧的上下文,并且将从EF缓存中返回数据。

确保在调用之间处理EF上下文,最佳做法是在Using语句中将其包围。另一种方法是在Context上调用Refresh()(参见this问题)。您仍然需要在某些时候处理上下文,否则它将继续增长,您的应用程序将变得越来越慢。

我已经回答了类似的问题here

答案 1 :(得分:0)

我已经按照Damon提供的链接,问题是刷新发生了。但这需要几秒钟(2或3)。该页面必须立即加载。

对我有用的解决方案是,在从存储库中获取数据时,我使用Set设置实体。然后我在获取数据之前使用了Refresh方法。

使用的代码:

DbSet set =((DbContext)Context).Set(); ((IObjectContextAdapter)Context).ObjectContext.Refresh(System.Data.Objects.RefreshMode.StoreWins,set); 将DbSet作为IQueryable返回;