anchor.diff:      //cache
       let changeMonitors = ConcurrentBag()
       [<VolatileField>]
  -    let mutable disposingCache = false
  +    let mutable clearingCache = false
       let cache = new MemoryCache(providerName)
   
  -    let disposeCache() = 
  -        disposingCache <- true
  +    let clearCache() = 
  +        clearingCache <- true
           while not changeMonitors.IsEmpty do
               let removed, (monitor: CacheEntryChangeMonitor) =  changeMonitors.TryTake()
               if removed then monitor.Dispose()
  -        cache.Dispose()
  +        
  +        // http://stackoverflow.com/a/29916907
  +        cache 
  +        |> Seq.map (fun e -> e.Key) 
  +        |> Seq.toArray
  +        |> Array.iter (cache.Remove >> ignore)
   
       let cacheGetOrAdd(key, value: Lazy<ProvidedTypeDefinition>, monitors) = 
           let policy = CacheItemPolicy()
  
positive.code:             then 
                  let m = cache.CreateCacheEntryChangeMonitor [ key ]
                  m.NotifyOnChanged(fun _ -> 
                      if not disposingCache 
                      then 
                          disposeCache()
                          this.Invalidate()
                  )
                  changeMonitors.Add(m)
  
negative.code:         this.AddNamespace( nameSpace, [ providerType ])
  
      do
          this.Disposing.Add <| fun _ -> clearCache()
  
      abstract CreateRootType: assemblyName: Assembly * nameSpace: string * typeName: string  * args: obj[] -> Lazy<ProvidedTypeDefinition> * obj[] // ChangeMonitor[] underneath but there is a problem https://github.com/fsprojects/FSharp.Data.SqlClient/issues/234#issuecomment-240694390
  