Это действительно очевидно, когда вы ищете это имя файла, а затем начинаете сравнивать версии пакетов.
Вам требуется 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.*
.
То, что @ emcas88 пытается сказать , состоит в том, что EF будет проверять кеш только при использовании метода .Find
на DbSet
.
Используя .Single
, .First
, .Where
и т. д. не будут кэшировать результаты, если вы не используете кэширование второго уровня.
Взгляните на EF Docs , вы найдете там ответ:
Обратите внимание, что DbSet и IDbSet всегда создают запросы к базе данных и всегда будут включать раунд выезд в базу данных, даже если возвращаемые объекты уже существуют в контексте. Запрос выполняется в отношении базы данных, когда:
blockquote>
- Он перечисляется оператором foreach (C #) или для каждого (Visual Basic).
- Он перечисляется коллекцией таких как
ToArray
,ToDictionary
илиToList
.- Операторы LINQ, такие как
First
илиAny
, указаны в самой внешней части запроса.- Вызываются следующие методы: метод расширения
Load
наDbSet
,DbEntityEntry.Reload
иDatabase.ExecuteSqlCommand
.
EF6 не выполняет кеширование результатов. Чтобы кэшировать результаты, вам необходимо использовать кеш второго уровня. См. Этот многообещающий проект по CodePlex:
Кэширование второго уровня для EF 6.1
Имейте в виду, что если данные изменяются на db, вы не будете немедленно знать об этом. Иногда это важно в зависимости от проекта. ;)
Это связано с тем, что для реализации методов экстензора используется метод Find контекста
contextName.YourTableName.Find()
для проверки первого кэша. Надеюсь, это поможет.
Иногда я использую свой метод расширения:
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.