【发布时间】:2015-10-26 08:57:20
【问题描述】:
在我们的系统中,我们已经实现了将存储过程的自定义 ADO.NET 数据导入到我们的数据库,因为 EF Code First 和 Linq2Sql 的性能对于我们必须处理的数据量来说还不够好。
问题在于,一旦导入作业完成,当使用 Code First DbContext 和对象查询新数据时,仍需要几分钟才能让新数据显示在我们的视图中。
我们没有使用任何自定义缓存或 OutputCache,因此唯一缓存结果的必须是 EF 本身。我们在 MVC 控制器上使用依赖注入来获取为视图提供数据模型的服务实例。范围设置为每个请求,因此一旦请求达到该控制器操作,就应该重新创建服务实例,对吗?
基本上,我们的服务派生自以下初始化正确上下文的基类。
public class ServiceBase<T> : IDisposable
where T : DbContext, new()
{
private T _context;
protected ServiceBase()
{
this._context = new T();
}
}
在我们的上下文中,我们将 Autodetectchanges 设置为 false
Configuration.AutoDetectChangesEnabled = false;
我们还在像这样的导入作业之后重新加载我们的 objectcontext 实体
var refreshableObjects = ObjectContext.ObjectStateManager
.GetObjectStateEntries(EntityState.Deleted | EntityState.Modified | EntityState.Unchanged)
.Where(o => o.EntityKey != null).Select(o => o.Entity);
ObjectContext.Refresh(RefreshMode.StoreWins, refreshableObjects);
但它不起作用。我试图查找有关如何正确重新加载 DbContext 的信息,但尚未弄清楚。它到处都说处理上下文并重新创建它应该清除缓存,但它似乎不起作用。
有人可以帮我吗?非常感谢!
【问题讨论】:
-
你不想让实体框架缓存你的结果?
-
当您使用 EF 时,默认情况下每个上下文仅加载每个实体一次。第一个查询创建实体实例并将其存储在内部。任何需要具有相同键的实体的后续查询都会返回此存储的实例。如果数据存储中的值发生更改,您仍然会收到带有初始查询值的实体
-
缓存很好,只要它很容易刷新。现在我不知道如何冲洗它。不是每次请求都会重新创建上下文,这意味着一旦我刷新页面,我应该从数据库而不是缓存实体中获取最新数据?
标签: c# sql-server asp.net-mvc entity-framework