Skip to content
This repository was archived by the owner on Feb 1, 2025. It is now read-only.

Commit 45cdc01

Browse files
committed
[Backport] Added caching for mapping schema. It significantly reduces memory usage.
1 parent 0c80ddc commit 45cdc01

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

Source/LinqToDB.EntityFrameworkCore/ILinqToDBForEFTools.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ public interface ILinqToDBForEFTools
4646
/// <param name="model">EF.Core data model.</param>
4747
/// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
4848
/// <returns>Mapping schema for provided EF.Core model.</returns>
49+
MappingSchema CreateMappingSchema(IModel model, IMetadataReader metadataReader);
50+
51+
/// <summary>
52+
/// Returns mapping schema using provided EF.Core data model and metadata provider.
53+
/// </summary>
54+
/// <param name="model">EF.Core data model.</param>
55+
/// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
56+
/// <returns>Mapping schema for provided EF.Core model.</returns>
4957
MappingSchema GetMappingSchema(IModel model, IMetadataReader metadataReader);
5058

5159
/// <summary>

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)