1

我遇到的问题如下,由于缓存问题,我们将以下内容放在每个 ET 查询开始之前:

DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers);

但是,这会导致页面需要很长时间才能加载,因为上述命令对数据库进行了两次调用。

有没有人知道阻止 EF 缓存而不必在每次查询之前放置该命令?

4

2 回答 2

2

回答你最初的问题。如果您不希望上下文缓存数据,则必须执行查询而不进行更改跟踪。

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

但这不会解决与 Web 应用程序中的静态/共享上下文相关的架构问题。如果你真的想创建工作应用程序,你必须改变你的架构。

于 2012-07-04T16:06:07.993 回答
0

您可以在创建上下文后将 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 是我的上下文。

于 2014-04-02T17:28:55.313 回答