实体框架和使用EF Provider Wrappers的第二级缓存

时间:2011-02-02 15:14:42

标签: entity-framework

我正在尝试使用实体框架4进行二级缓存。由Jarek Kowalski(http://code.msdn.microsoft.com/EFProviderWrappers/Release/ProjectReleases.aspx?ReleaseId=4747)制作的“EF Provider Wrappers”工作得很好,我遇到的问题是所有缓存的条目来自一旦对表进行更新,表就会失效。这是有意的,还是我在实施中犯了错误?

如果是这样的话,它会对具有大量更新的表格完全无用。有什么方法可以解决这个问题吗?

这是我使用ScaleOut StateServer作为缓存的ICache接口的实现:

    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 个答案:

答案 0 :(得分:3)

是的,这是故意的。作者在您共享的link中提到了它。

“EFCachingProvider有点复杂。它使用外部缓存实现并缓存在DbCommand.ExecuteReader()中执行的所有查询查询的结果。每当检测到更新时(UPDATE,INSERT或DELETE) )提供程序通过逐出所有依赖于任何更新表的高速缓存查询来使受影响的高速缓存条目无效。

我不确定你的案件会有什么清洁解决方案。但是,如果您的表经常更新,则最好不要缓存该表的条目。您可以使用“CustomCachingPolicy”来排除该表的缓存。

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