实体框架 - 缓存问题

时间:2012-07-04 14:19:08

标签: entity-framework caching entity

我遇到的问题如下,由于缓存问题,我们在每个ET查询开始之前都会提出以下问题:

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

但是,由于上面的命令对数据库进行了两次调用,这导致页面加载需要很长时间。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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是我的背景。