Entity Framework和使用EF Provider Wrappers的二级缓存

4
我正在尝试让实体框架4与二级缓存配合使用。Jarek Kowalski制作的“EF Provider Wrappers”(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

是有意为之的。作者在你分享的同一链接中提到了这一点。

“EFCachingProvider稍微复杂一些。它使用外部缓存实现并缓存所有查询结果,这些查询是在DbCommand.ExecuteReader()中执行的。每当检测到更新(无论是UPDATE、INSERT还是DELETE),该提供程序都会通过驱逐所有依赖于已更新表中任何一个的缓存查询来使受影响的缓存条目无效。

我不确定对于你的情况,一个完美的解决方案是什么。但是如果你的表非常频繁地更新,最好不要缓存该表的条目。你可以使用“CustomCachingPolicy”来排除该表的缓存。

“CustomCachingPolicy-包括用户可配置的应缓存和不应缓存的表列表,以及过期时间和结果大小限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接