@@ -26,6 +26,7 @@ namespace LinqToDB.EntityFrameworkCore
2626 using Mapping ;
2727 using Metadata ;
2828 using Extensions ;
29+ using Common . Internal . Cache ;
2930
3031 using DataProvider ;
3132 using DataProvider . DB2 ;
@@ -83,9 +84,17 @@ public override int GetHashCode()
8384
8485 readonly ConcurrentDictionary < ProviderKey , IDataProvider > _knownProviders = new ConcurrentDictionary < ProviderKey , IDataProvider > ( ) ;
8586
87+ private readonly MemoryCache _schemaCache = new MemoryCache (
88+ new MemoryCacheOptions
89+ {
90+ ExpirationScanFrequency = TimeSpan . FromHours ( 1.0 )
91+ } ) ;
92+
93+
8694 public virtual void ClearCaches ( )
8795 {
8896 _knownProviders . Clear ( ) ;
97+ _schemaCache . Compact ( 1.0 ) ;
8998 }
9099
91100 /// <summary>
@@ -346,14 +355,31 @@ public virtual IMetadataReader CreateMetadataReader(IModel model,
346355 /// <param name="model">EF.Core data model.</param>
347356 /// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
348357 /// <returns>Mapping schema for provided EF.Core model.</returns>
349- public virtual MappingSchema GetMappingSchema ( IModel model , IMetadataReader metadataReader )
358+ public virtual MappingSchema CreateMappingSchema ( IModel model , IMetadataReader metadataReader )
350359 {
351360 var schema = new MappingSchema ( ) ;
352361 if ( metadataReader != null )
353362 schema . AddMetadataReader ( metadataReader ) ;
354363 return schema ;
355364 }
356365
366+ /// <summary>
367+ /// Returns mapping schema using provided EF.Core data model and metadata provider.
368+ /// </summary>
369+ /// <param name="model">EF.Core data model.</param>
370+ /// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
371+ /// <returns>Mapping schema for provided EF.Core model.</returns>
372+ public virtual MappingSchema GetMappingSchema ( IModel model , IMetadataReader metadataReader )
373+ {
374+ var result = _schemaCache . GetOrCreate ( Tuple . Create ( model , metadataReader ) , e =>
375+ {
376+ e . SlidingExpiration = TimeSpan . FromHours ( 1 ) ;
377+ return CreateMappingSchema ( model , metadataReader ) ;
378+ } ) ;
379+
380+ return result ;
381+ }
382+
357383 /// <summary>
358384 /// Returns EF.Core <see cref="IDbContextOptions"/> for specific <see cref="DbContext"/> instance.
359385 /// </summary>
0 commit comments