2011-02-02 80 views
4

我试图让第二级缓存与实体框架4一起工作。由Jarek Kowalski(http://code.msdn.microsoft.com/EFProviderWrappers/Release/ProjectReleases.aspx?ReleaseId=4747)制作的“EF提供者包装”工作得很好,我遇到的问题一旦对表进行更新,表中的所有缓存条目都会失效。这是打算,还是我在我的实施中犯了一个错误?实体框架和EF提供者包装的第二级缓存

如果这是有意的,那么它会在有很多更新的表上完全无用。有什么办法可以解决这个问题吗?

这是我的执行将指令界面,使用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); 
    } 
} 

回答

3

是的,这是故意的。作者在您分享的相同link中提到过它。

“EFCachingProvider是更复杂一点。它使用每当检测更新了在DbCommand.ExecuteReader()。执行的所有查询的查询的外部缓存实现和高速缓存的结果(无论是UPDATE,插入或删除)的提供者通过驱逐所有依赖任何更新表的缓存查询来使受影响的缓存条目失效。

我不确定干净的解决方案对于您的情况会是什么。但是,如果您的表经常更新,则最好不要缓存该表的条目。您可以使用“CustomCachingPolicy”将该表从缓存中排除。

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

相关问题