Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, kirillmager, Вы писали:
K>>Привет всем!
K>>Проблема с ASP.NET MVC приложением — в UI показываются старые данные при обновлении их напрямую в SQL Server.
K>>Куда смотреть? Может быть в кэширование в EF6?
G>Контекст в статической переменной хранишь?
G>А вообще покажи код.
Копание в коде показывает, что дело, скороей всего, в NavigationProperty. Именно при обновлении их списка в SQL Server обновления в UI нет. Пытаюсь подгрузить их так:
Parent GetParent(int parentId){
Parent parent = Holder.Get<Parent>().FindSingle(new Specification<Parent>(p => p.ParentId == parentId));
Holder.ReloadNavigationProperty(parent, (p => p.Children));
return parent
}
Код в классе Holder для ReloadNavigationProperty:
public void ReloadNavigationProperty<TEntity, TElement>(TEntity entity, Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) where TEntity : class, IEntity where TElement : class, IEntity
{
((DbContext)Context).ReloadNavigationProperty<TEntity, TElement>(entity, navigationProperty);
}
Код для Extension-метода
public static class ReloadMethods
{
public static void ReloadNavigationProperty<TEntity, TElement>(this DbContext context, TEntity entity, Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) where TEntity : class where TElement : class, IEntity
{
context.Entry(entity).Collection<TElement>(navigationProperty).Load();
}
}
При этом странность: при добавлении в SQL Server еще одной записи для NavigationProperty обновление в UI есть — показывается на 1 запись больше.
А вот если удалить в SQL Server записи для NavigationProperty, то в UI никакого обновления (по F5) — удаленная запись показывается.
Здравствуйте, kirillmager, Вы писали:
K>Здравствуйте, gandjustas, Вы писали:
K>Копание в коде показывает, что дело, скороей всего, в NavigationProperty.
Дело, скорее всего, в том что Holder у тебя статический класс и DbContext используется один на все запросы. Это неподдерживаемый сценарий.
Причина — слишком много паттернов. Singleton тут совершенно не к месту.
Использование Specification тоже доставляет.
Ты реально считаешь что код
K>K>Parent parent = Holder.Get<Parent>().FindSingle(new Specification<Parent>(p => p.ParentId == parentId));
K>
лучше чем
var parent = ctx.Parent.Where(p => p..ParentId == parentId).FirstOrDefault()
?
Тем более во второй вариант достаточно вписать Include и получить сразу нужные записи, а не таскать их отдельным запросом.