【问题标题】:Ado.net stored procedure inserts does not show on EF Code First queries instantlyAdo.net 存储过程插入不会立即显示在 EF Code First 查询中
【发布时间】: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


【解决方案1】:

如果您知道更改发生在 EF 之外并希望刷新特定实体的 ctxt,您可以致电 ObjectContext.Refresh

datamodel.Refresh(RefreshMode.StoreWins, orders);

如果这看起来很常见,您应该在查询中禁用对象缓存:

SchoolBriefcaseEntities datamodel = new SchoolBriefcaseEntities();
datamodel.tblCities.MergeOption = MergeOption.NoTracking; 

或用于关闭特定实体的对象级缓存,

Context.Set<Compliances>().AsNoTracking();

【讨论】:

  • 我们在问题中提到的导入后调用 ObjectContext.Refresh ,但这似乎不起作用。我不想禁用缓存我只想在数据导入完成后重置它。
  • @suomiton 查看这篇文章bfcamara.com/post/37112709703/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多