我遇到的问题如下,由于缓存问题,我们将以下内容放在每个 ET 查询开始之前:
DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers);
但是,这会导致页面需要很长时间才能加载,因为上述命令对数据库进行了两次调用。
有没有人知道阻止 EF 缓存而不必在每次查询之前放置该命令?
我遇到的问题如下,由于缓存问题,我们将以下内容放在每个 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 应用程序中的静态/共享上下文相关的架构问题。如果你真的想创建工作应用程序,你必须改变你的架构。
您可以在创建上下文后将 MergeOption 设置为所有 EntitieSet。有些像这样:
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;
}
在此处阅读有关 MergeOption 的信息:http: //msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx 我认为您将使用 NoTracking。
但是,你想清除“缓存”实体,将其分离。
var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);
foreach (var objectStateEntry in entidades)
Ctx.Detach(objectStateEntry.Entity);
Ctx 是我的上下文。