Skip to content

Commit ca4667a

Browse files
Merge pull request #332 from oikku/master
Invalidate SqlFile type when referenced SQL file is modified.
2 parents b78ff71 + bc7732d commit ca4667a

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

src/SqlClient.DesignTime/ProvidedTypesCache.fs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,11 @@ type TypeName = string
88
type Cache<'a>() =
99
let cache = ConcurrentDictionary<TypeName, Lazy<'a>>()
1010

11+
member __.TryGetValue(typeName: TypeName) =
12+
cache.TryGetValue(typeName)
13+
1114
member __.GetOrAdd(typeName: TypeName, value: Lazy<'a>): 'a =
12-
cache.GetOrAdd(typeName, value).Value
15+
cache.GetOrAdd(typeName, value).Value
16+
17+
member __.Remove(typeName: TypeName) =
18+
cache.TryRemove(typeName) |> ignore

src/SqlClient.DesignTime/SingleRootTypeProvider.fs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,22 @@ type SingleRootTypeProvider(config: TypeProviderConfig, providerName, parameters
2121
providerType.DefineStaticParameters(
2222
parameters = parameters,
2323
instantiationFunction = fun typeName args ->
24-
let typ, monitors = this.CreateRootType(assembly, nameSpace, typeName, args)
25-
cache.GetOrAdd(typeName, typ)
24+
match cache.TryGetValue(typeName) with
25+
| true, cachedType -> cachedType.Value
26+
| false, _ ->
27+
let typ, monitors = this.CreateRootType(assembly, nameSpace, typeName, args)
28+
monitors
29+
|> Seq.iter(fun m ->
30+
match m with
31+
| :? System.Runtime.Caching.ChangeMonitor as monitor ->
32+
monitor.NotifyOnChanged(fun _ ->
33+
cache.Remove(typeName)
34+
this.Invalidate()
35+
monitor.Dispose()
36+
)
37+
| _ -> ()
38+
)
39+
cache.GetOrAdd(typeName, typ)
2640
)
2741

2842
this.AddNamespace( nameSpace, [ providerType ])

0 commit comments

Comments
 (0)