Используйте EF Code First Local Extention
Следующий метод работает должным образом на моем уровне обслуживания:
public override IList<City> GetAll()
{
var query = from item in _tEntities
select item;
query.Load();
return _tEntities.Local;
}
но когда я пытаюсь запустить следующий метод, метод возвращает старые данные, загруженные методом GetAll().
public override IList<City> GetAll(Func<City, bool> predicate)
{
var query = from item in _tEntities
select item;
query.Where<City>(predicate);
query.Load();
return _tEntities.Local;
}
В чем проблема и как я могу их исправить?
Как я могу использовать локальный метод в этом примере и перезагрузить новые данные в локальный (кеш)?
3 ответа
Вы смотрите не на ту проблему. Скорее всего, вы видите результат того, что при выполнении первого запроса локальный кеш пуст. Таким образом, он возвращает только результаты вашего запроса. Но когда вы делаете второй, он возвращает результаты вашего первого запроса и вашего второго запроса.
Это сводится к тому, что вы используете общий DbContext между всеми вашими методами. Local содержит кэш всех записей, полученных контекстом, а не только самый последний запрос.
Правильное решение - не использовать Local таким образом. Более того, не используйте общий контекст, так как это может привести к раздуванию кеша контекста.
Я не слишком уверен, чего вы пытаетесь достичь с помощью метода.Load, но, похоже, вам нужно следующее.
public override IList<City> GetAll(Func<City, bool> predicate)
{
return _tEntities.Where<City>(predicate).ToList();
}
query.Where<City>(predicate);
Это не меняет query
, query.Load()
на следующей строке игнорирует предикат: вы звоните query.Load()
и не query.Where<City>(predicate).Load()
, Это как если бы вы написали
int i = 3; i + 1; Console.WriteLine(i); // still prints 3
В этом примере C# на самом деле не позволяет использовать дополнение как оператор, но .Where(predicate)
является вызовом метода, и вызовы метода могут использоваться как таковые, даже если они возвращают значения.
Это не единственная ваша проблема (см. Другие ответы), но я думаю, что эта проблема приводит к неожиданным результатам, которые вы видите.