Entity framework 实体框架-缓存问题

Entity framework 实体框架-缓存问题,entity-framework,caching,entity,Entity Framework,Caching,Entity,我遇到的问题如下所示,由于缓存问题,我们在开始每个ET查询之前都会考虑以下内容: DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers); 但是,由于上面的命令对数据库进行了两次调用,这会导致页面加载时间过长 有人知道如何停止EF缓存,而不必在每次查询前都发出该命令吗?回答您的初始问题。若不希望上下文缓存数据,则必须在不进行更改跟踪的情况下执行查询 Database.Hubs.Merg

我遇到的问题如下所示,由于缓存问题,我们在开始每个ET查询之前都会考虑以下内容:

DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers);
但是,由于上面的命令对数据库进行了两次调用,这会导致页面加载时间过长


有人知道如何停止EF缓存,而不必在每次查询前都发出该命令吗?

回答您的初始问题。若不希望上下文缓存数据,则必须在不进行更改跟踪的情况下执行查询

Database.Hubs.MergeOption = MergeOption.NoTracking;
return DataBase.Hubs
            .Where(h =>
                h.BusinessId == null
                && h.TypeId != (int)HubType.BusinessPlace
                && h.ParentHubId != null
            );

但这并不能解决与web应用程序中的静态/共享上下文相关的体系结构问题。如果确实要创建工作应用程序,则必须更改体系结构。

创建上下文后,可以将“合并”选项设置为“所有实体集”。有些人喜欢这样:

var objSetProps = ctx.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>));
foreach (PropertyInfo objSetProp in objSetProps)
{
    ObjectQuery objSet = (ObjectQuery)objSetProp.GetValue(ctx, BindingFlags.GetProperty, null, null, null);
    objSet.MergeOption = MergeOption.PreserveChanges;
}

其中Ctx是我的上下文。

为什么要执行刷新?因此每次执行查询时,我们都使用最新的数据。您在构建什么样的应用程序?你提到了网页-它是一个web应用程序吗?在这种情况下,这种情况永远不会发生,除非您正在重用上下文,这使得您的应用程序毫无用处。我们正在开发一个网站,但是我的开发人员说,在使用这种方法之前,数据似乎已经缓存了。你是说如果我们手动更改数据库中的数据,我们需要停止并再次启动应用程序吗?不,你不需要启动并停止应用程序。只有在多个请求之间缓存
数据库
实例时,才会出现此问题。就是这样。
var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);
foreach (var objectStateEntry in entidades)
    Ctx.Detach(objectStateEntry.Entity);