我在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();
}
我能够在数据库中更新,但是当它尝试从同一个表中立即检索数据时,它没有访问数据库,我认为它是从缓存中获取数据。
欢迎提出任何指示。
提前致谢, 吉里什。
答案 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返回;