Как очистить кэш DataContext на Linq to Sql - PullRequest
13 голосов
/ 20 января 2010

Я использую Linq to Sql для запроса какой-либо базы данных, я использую Linq только для чтения данных из БД, и я изменяю ее другими способами.(Это нельзя изменить, это ограничение приложения, которое мы расширяем, все обновления должны проходить через его SDK).

Это нормально, но я сталкиваюсь с некоторыми проблемами с кешем, в основном, я запрашиваюстрока, используя Linq, затем я удаляю ее с помощью внешних средств, а затем создаю новую строку извне, если я снова запрашиваю эту строку, используя linq, я получаю старые (кэшированные) данные.

Я не могу отключить отслеживание объектовпотому что это, кажется, мешает контексту данных автоматически загружать связанные свойства (Foreign Keys).

Есть ли способ очистить кэш DataContex?

Я нашел метод, страдающий от сети, но он не кажется безопасным: http://blog.robustsoftware.co.uk/2008/11/clearing-cache-of-linq-to-sql.html

Что вы думаете?какие у меня варианты?

Ответы [ 3 ]

20 голосов
/ 20 января 2010

Если вы хотите обновить конкретный объект, тогда лучшим выбором может быть метод Refresh () .

Например:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);

Вы можететакже передайте массив объектов или IEnumerable в качестве 2-го аргумента, если вам нужно обновить более одного объекта одновременно.

Обновление

Я вижу, о чем вы говорите в комментариях,в отражателе вы видите, что это происходит внутри .Refresh ():

object objectByKey = context.Services.GetObjectByKey(trackedObject.Type, keyValues);
if (objectByKey == null)
{
    throw Error.RefreshOfDeletedObject();
}

Метод, который вы связали, кажется вашим лучшим вариантом, класс DataContext не предоставляет другого способа очистки удаленной строки.Проверки удаления и тому подобное находятся внутри метода ClearCache() ... на самом деле это просто проверка на удаление и вызов ResetServices() для CommonDataServices внизу ... единственным плохим эффектом будет очистка любых ожидающих вставок, обновлений или удалений, которыеВы в очереди.

Есть еще один вариант, можете ли вы запустить другой DataContext для любой операции, которую вы делаете?Он не будет иметь кеша ... но это потребует некоторых вычислительных затрат, поэтому, если ожидающие вставки, обновления и удаления не являются проблемой, я бы придерживался подхода ClearCache().

1 голос
/ 02 апреля 2014

Я сделал этот код, чтобы действительно ОЧИСТИТЬ «кэшированные» сущности, отсоединив его.

var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);
foreach (var objectStateEntry in entidades)
    Ctx.Detach(objectStateEntry.Entity);

Где Ctx - мой контекст.

0 голосов
/ 20 января 2010

Вы должны иметь возможность просто запросить наборы результатов, которые используют эти объекты. Это не будет тянуть кэшированный набор, но на самом деле вернет окончательные результаты. Я знаю, что это может быть не так просто или выполнимо в зависимости от того, как вы настроили свое приложение ...

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...