我遇到的问题如下,由于缓存问题,我们在每个ET查询开始之前都会提出以下问题:
DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers);
但是,由于上面的命令对数据库进行了两次调用,这导致页面加载需要很长时间。
有没有人知道要阻止EF缓存而不必在每次查询之前放置该命令?
答案 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是我的背景。