Есть ли способ лениво загружать свойства навигации объекта любого типа сущности poco, который находится в памяти и не отслеживается DbContext? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть корпоративное приложение в asp.net mvc.Для производительности мы устанавливаем слой кэша в нашем приложении.Рассмотрим код _dataAccess.MyTable.GetList() в моем приложении.Сначала он проверит кэш, чтобы увидеть, есть ли у нас результаты для этой таблицы.Если мы это сделаем, он вернет результат из кеша, в противном случае он попадет в базу данных и заполнит кеш тоже, чтобы последующие запросы обслуживались нашим кешем.Мы используем Redis для нашего слоя кэширования.И во время кеширования мы не кешируем данные свойств навигации.

Я показал пример кода для моего GetList() метода.Проблема в том, что метод GetList() возвращает IQueryable, поэтому я увеличиваю запрос в соответствии со своими потребностями.Когда запрос обрабатывается моей базой данных, тогда возвращенный IQueryable работает нормально, так как я обращаюсь к какому-либо свойству навигации по нему, он лениво загружает этот объект.Но для последующего запроса, когда данные возвращаются из кэша, а не из базы данных, свойство навигации не загружает данные лениво.

Есть ли способ не кэшировать содержимое свойств навигации, а только родительские объекты, а затемлениво загружать эти свойства навигации по требованию?

Рассмотрим код _dataAccess.MyTable.GetList().where(x=>x.someNavigationProperty.someProperty=="some val").tolist()

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

public IQueryable<TEntity> GetList()
{          
    if (_cachingStrategy.IsItemExists<TEntity>())
    {
        return _cachingStrategy.GetList<TEntity>();

    }
    var data= this._dataStoreStrategy.GetList();
    _cachingStrategy.SetList<TEntity>(data.ToList(), TimeSpan.FromDays(100));
    return data;
}
...