ASP.NET MVC + EF6 - не обновляются данные в UI
От: kirillmager  
Дата: 03.11.16 08:03
Оценка:
Привет всем!
Проблема с ASP.NET MVC приложением — в UI показываются старые данные при обновлении их напрямую в SQL Server.
Куда смотреть? Может быть в кэширование в EF6?

Более подробно:
ASP.NET MVC приложение + Repository Pattern c EF6 для получения данных из SQL Server.
Под Visual Studio все нормально (после обновлении / добавлении данных непосредственно в SQL Server они появляются в UI).
После выкладывания версии на Web-server начинаются проблемы — если обновить / добавить данные напрямую в SQL Server, то обновленные данные не появляются в UI.

Помогите, please.
mvc ef
Re: ASP.NET MVC + EF6 - не обновляются данные в UI
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.11.16 08:27
Оценка:
Здравствуйте, kirillmager, Вы писали:

K>Привет всем!

K>Проблема с ASP.NET MVC приложением — в UI показываются старые данные при обновлении их напрямую в SQL Server.
K>Куда смотреть? Может быть в кэширование в EF6?
Контекст в статической переменной хранишь?

А вообще покажи код.
Re[2]: ASP.NET MVC + EF6 - не обновляются данные в UI
От: kirillmager  
Дата: 03.11.16 11:42
Оценка:
Здравствуйте, 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) — удаленная запись показывается.
Отредактировано 03.11.2016 11:43 kirillmager . Предыдущая версия .
Re[3]: ASP.NET MVC + EF6 - не обновляются данные в UI
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.11.16 14:15
Оценка: +1
Здравствуйте, 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 и получить сразу нужные записи, а не таскать их отдельным запросом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.