Entity Framework и кэширование 2-го уровня с EF Provider Wrappers - PullRequest
4 голосов
/ 02 февраля 2011

Я пытаюсь заставить кеширование 2-го уровня работать с платформой сущностей 4. «Оболочки провайдеров EF», сделанные Яреком Ковальским (http://code.msdn.microsoft.com/EFProviderWrappers/Release/ProjectReleases.aspx?ReleaseId=4747), работают довольно хорошо, проблема в том, что все кэшированные записи таблица становится недействительной, как только в нее вносится обновление. Это предназначено, или я допустил ошибку в моей реализации?

Если это предусмотрено, это делает его абсолютно бесполезным для таблиц, которые имеют много обновлений. Есть ли способ исправить это?

Это моя реализация интерфейса ICache, использующая ScaleOut StateServer в качестве кеша:

    public class SossCache : ICache
{
    private readonly NamedCache SossCache;      

    public SossCache(string cacheName)
    {
        this.SossCache = CacheFactory.GetCache(cacheName);
    }

    public bool GetItem(string key, out object value)
    {
        value = this.SossCache.Get(key);
        return value != null;
    }

    public void PutItem(string key, object value, IEnumerable<string> dependentEntitySets, TimeSpan slidingExpiration, DateTime absoluteExpiration)
    {
        bool isAbsoluteTimeout = slidingExpiration == TimeSpan.Zero;
        TimeSpan timeout = isAbsoluteTimeout ? absoluteExpiration.Subtract(DateTime.Now) : slidingExpiration;

        CreatePolicy createPolicy = new CreatePolicy(timeout, isAbsoluteTimeout, ObjectPreemptionPriority.Normal, dependentEntitySets.ToArray(), true);         
        this.SossCache.Insert(key, value, createPolicy, true, false);
    }

    public void InvalidateItem(string key)
    {
        this.SossCache.Remove(key);
    }

    public void InvalidateSets(IEnumerable<string> entitySets)
    {
        foreach (string key in entitySets)
            InvalidateItem(key);
    }
}

1 Ответ

3 голосов
/ 03 октября 2011

Да, это намеренно. Автор упомянул об этом в той же ссылке , которой вы поделились.

"EFCachingProvider немного сложнее. Он использует внешнюю реализацию кэширования и кэширует результаты всех запросов, которые выполняются в DbCommand.ExecuteReader (). При каждом обнаружении обновления (UPDATE, INSERT или DELETE ) поставщик делает недействительными записи в кеше, исключая все кэшированные запросы, которые зависели от любой из обновленных таблиц."

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

"CustomCachingPolicy - включает настраиваемый пользователем список таблиц, которые должны и не должны кэшироваться , а также время истечения срока действия и ограничения размера результата."

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