Две вещи, чтобы иметь в виду:
Если вы Local.Clear()
субъекты в Local
коллекции помечаются для удаления. Таким образом, объект с ключевыми значениями (973, "ShowSoldOut")
все еще присутствует в кэше контекста, но его состояние - Deleted
. (То же самое для одного с (142, "AllowIndex")
, позже).
DbSet.Find
сначала ищет сущности в кэш контекста, а затем, когда не найден, он выглядит в базе данных. Если объект найден в кеше, но удален, EF показывает, что его больше не должно быть, и он не возвращает его.
Я не знаю, почему вы делаете эти Local.Clear()
звонков, но я надеюсь, вы понимаете теперь, что это заявление использовать с осторожностью.
Правильный способ очистить кэш является отсоединение сущностей, например, для одной Local
коллекции:
foreach (var x in db3.TabModuleSettings.Local.ToList())
{
Entry(x).State = System.Data.Entity.EntityState.Detached;
}
(хотя это не отделится удаленные объекты).
Или весь кэш:
foreach (var entry in db3.ChangeTracker.Entries())
{
entry.State = System.Data.Entity.EntityState.Detached;
}
(также отделяться удаленные объекты).
Или все объекты определенного типа (включая удаленные):
foreach (var entry in db3.ChangeTracker.Entries<TabModuleSetting>())
{
entry.State = System.Data.Entity.EntityState.Detached;
}
Хотя обычно вы не должны делать это. Обычно лучше удалять контекст и создавать новый, если вы хотите обновить объекты.
Итак, как мне заставить искать базу данных, а не искать кеш? Или, как я освобождаю кеш? The .Clear предназначен для опорожнения набора результатов. Есть много вещей, которые происходят между операторами .Find. – Chris
Добавлена дополнительная информация. –
ОК. Я думал, что будет удар производительности при утилизации и повторной инициализации класса IMS. В первый раз это занимает около 15 секунд. Но, db3.Dispose() db3 = new IMS(), похоже, не вызывает проблемы с производительностью и обрабатывает то, что мне нужно. – Chris