2012-07-04 7 views
1

Проблемы я имею следующий образ, из-за проблемы кэширования мы вкладываем следующее перед началом каждого запроса ET:Entity Framework - Кэширование Выпуска

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

Однако это вызывает страницу принять возрасты для загрузки, поскольку указанная выше команда выполняет два вызова в базу данных.

Кто-нибудь знает, чтобы остановить EF от кеширования без необходимости добавлять эту команду перед каждым запросом?

+0

И почему вы выполняете это освежающее? –

+0

поэтому каждый раз, когда мы выполняем запрос, мы используем самые последние данные. – swade1987

+0

Какое приложение вы строите? Вы упомянули страницы - это веб-приложение? В таком случае это никогда не произойдет, если вы не используете контекст, который делает ваше приложение бесполезным. –

ответ

2

Чтобы ответить на ваш первоначальный вопрос. Если вы не хотите, чтобы контекст кэшировал данные, вы должны выполнить запрос без отслеживания изменений.

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

Но это не решит вашу архитектурную проблему, связанную со статическим/общим контекстом в веб-приложении. Вы должны изменить свою архитектуру, если хотите создать рабочее приложение.

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 - мой контекст.

Смежные вопросы