Entity Framework 6 не кэширует результаты запроса linq [duplicate]

Это действительно очевидно, когда вы ищете это имя файла, а затем начинаете сравнивать версии пакетов.

Вам требуется laravelcollective/html в любой версии, поэтому на данный момент последней версией является 5.5.x. Этот пакет, в свою очередь, требует "doctrine/inflector": "~1.1",, поэтому любая версия ниже 2.0, которая в настоящее время 1.3.0, и требует PHP 7.0 или выше.

Если вы посмотрите на источник последнего inflector.php , вы увидите, что тип возвращаемого значения указан в строке 265, который поддерживается только в PHP 7.0 и выше.

Вы используете PHP 5.6.24, поэтому этот код не будет работать в вашей системе.

Простой способ исправить вашу ошибку - использовать версию laravelcollective/html, соответствующую вашей версии Laravel. Вероятно, это будет 5.2.*.

32
задан Adam Modlin 11 February 2014 в 18:51
поделиться

5 ответов

То, что @ emcas88 пытается сказать , состоит в том, что EF будет проверять кеш только при использовании метода .Find на DbSet.

Используя .Single, .First, .Where и т. д. не будут кэшировать результаты, если вы не используете кэширование второго уровня.

34
ответ дан Community 5 September 2018 в 07:23
поделиться

Взгляните на EF Docs , вы найдете там ответ:

Обратите внимание, что DbSet и IDbSet всегда создают запросы к базе данных и всегда будут включать раунд выезд в базу данных, даже если возвращаемые объекты уже существуют в контексте. Запрос выполняется в отношении базы данных, когда:

  • Он перечисляется оператором foreach (C #) или для каждого (Visual Basic).
  • Он перечисляется коллекцией таких как ToArray, ToDictionary или ToList.
  • Операторы LINQ, такие как First или Any, указаны в самой внешней части запроса.
  • Вызываются следующие методы: метод расширения Load на DbSet, DbEntityEntry.Reload и Database.ExecuteSqlCommand.
10
ответ дан cin 5 September 2018 в 07:23
поделиться

EF6 не выполняет кеширование результатов. Чтобы кэшировать результаты, вам необходимо использовать кеш второго уровня. См. Этот многообещающий проект по CodePlex:

Кэширование второго уровня для EF 6.1

Имейте в виду, что если данные изменяются на db, вы не будете немедленно знать об этом. Иногда это важно в зависимости от проекта. ;)

7
ответ дан Dave 5 September 2018 в 07:23
поделиться

Это связано с тем, что для реализации методов экстензора используется метод Find контекста

contextName.YourTableName.Find()

для проверки первого кэша. Надеюсь, это поможет.

24
ответ дан emcas88 5 September 2018 в 07:23
поделиться

Иногда я использую свой метод расширения:

using System.Linq;
using System.Linq.Expressions;

namespace System.Data.Entity
{
    public static class DbSetExtensions
    {
        public static TEntity FirstOrDefaultCache<TEntity>(this DbSet<TEntity> queryable, Expression<Func<TEntity, bool>> condition) 
            where TEntity : class
        {
            return queryable
                .Local.FirstOrDefault(condition.Compile()) // find in local cache
                   ?? queryable.FirstOrDefault(condition); // if local cache returns null check the db
        }
    }
}

Использование:

db.Invoices.FirstOrDefaultCache(x => x.CustomerName == "Some name");

Вы также можете заменить FirstOrDefault на SingleOrDetfault.

19
ответ дан Giuseppe Romagnuolo 5 September 2018 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: